錯誤是最有效的學(xué)習(xí)了,不錯我是沒辦法集中注意力去學(xué)習(xí),雖然很簡單,但是還是詳細(xì)有條理的寫一下找到錯誤,不能靠碰運(yùn)氣寫程序,浪費(fèi)時間精力。
1.循環(huán)方式的USART
1.1功能:僅實(shí)現(xiàn)不停向PC發(fā)送數(shù)據(jù)
①首先確定串口,STM32的PA9和PA10對應(yīng)的是 串口1 ,其中串口1時鐘的打開函數(shù)為RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);可見串口1為高速外設(shè)時鐘(APB2),具體的需要再參考數(shù)據(jù)手冊 。
②配置程序包括:RCC配置 (不知道具體干什么的);GPIO配置;NVIC配置(中斷配置,循環(huán)用不到);USART配置
③RCC配置 除了時鐘配置需要修改,其他暫時沒有發(fā)現(xiàn)不同,需要打開中斷時鐘,GPIO時鐘,還有AFIO復(fù)用時鐘(?,這個可以深入看一看,不太明白,功能是當(dāng)外設(shè)用的復(fù)用IO就需要開啟,這里應(yīng)該是不需要的,參考http://blog.sina.com.cn/s/blog_5d9349d10100u9ni.html)
④GPIO配置 TX設(shè)置為復(fù)用推挽輸出(GPIO_Mode_AF_PP)RX設(shè)置為懸空輸入(GPIO_Mode_IN_FLOATING)
⑤ USART配置 這個寫的是五花八門,問題多半出在這里,大分歧是需不需要進(jìn)行時鐘的配置,打開庫文件,找到USART_ClockInitTypeDef結(jié)構(gòu)體的定義:
typedef struct
{
uint16_t USART_Clock;
uint16_t USART_CPOL;
uint16_t USART_CPHA; //這個有問題,有兩種配置方式USART_CPHA_1Edge和USART_CPHA_2Edge,不知道有沒有影響
uint16_t USART_LastBit;
} USART_ClockInitTypeDef;
然后分別初始化時鐘和串口,使能串口
⑥發(fā)送數(shù)據(jù)函數(shù)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}返回bitstatus,這個我是不太看得懂,因?yàn)椴恢繳SARTx->SR(狀態(tài)寄存器)DR(數(shù)據(jù)寄存器)和USART_FLAG_TXE分別是如何操作的。但是有本書里提供了自己寫的驅(qū)動,里面說STM32固件中的字符發(fā)送函數(shù)不帶發(fā)送完成的判斷就馬上返回,所以會出現(xiàn)掉數(shù)據(jù)的現(xiàn)象,書中的函數(shù)應(yīng)該問題不大,不過先試一試,我在做實(shí)驗(yàn)時,將一個燈綁在發(fā)送程序上,當(dāng)發(fā)送時,燈被點(diǎn)亮,而復(fù)位后,燈一直在閃爍,這就是說程序正常執(zhí)行了,也就是說while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)這個判斷一直可以通過,這是什么情況我就得搞懂庫中的函數(shù)了。書里的代碼也是按寄存器和位寫的,搞懂也不容易啊。