生活随笔
收集整理的這篇文章主要介紹了
两块stm32仿真protues串口通信程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是本人一個作業,卻整整花了兩天時間才搞完,因為網上關于stm32的仿真很少,所以應該是網上第一份protues兩塊單片機實現串口交互的程序,實在是值得紀念一下。
前文提要,由于protues仿真庫函數bug太多,所以采用寄存器的初始化版本原作者
后面會發原程序下載地址
首先我們知道串口交互程序需要uasrt初始化,這邊采用的是原子哥的例程實驗四的初始化,這個可以自行參考資料,這邊就不放代碼圖了。
led和key配置,這邊放兩個的.h代碼就好
#define LED5 PBout(4)
#define LED4 PBout(5)
#define LED3 PBout(6)void LED_Init(void);
#define KEY0 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)
#define KEY1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)
#define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define KEY3_PRES 4
#define KEY4_PRES 5
這兩個初始化程序也是原子哥的,可以自行找代碼參考如何實現。
這個是作業內容,但是問題是如何實現
按鍵控制實現比較簡單,如何實現發送信號和接收信號是一個問題
首先必須知道usar的函數是如何實現,這邊就介紹我們需要的發送和接收就好。
void USART_SendData(USART_TypeDef
* USARTx
, uint16_t Data
)
{assert_param(IS_USART_ALL_PERIPH(USARTx
));assert_param(IS_USART_DATA(Data
)); USARTx
->DR
= (Data
& (uint16_t
)0x01FF);
}
0x02就是十六進制,0x02=00000010,這里我也不多贅述了。
這邊還有一個關鍵點,很多人可能發送數據只會發一個數據,例如:
USART_SendData(USART1
,0x00) ;
USART_SendData(USART1
,0x01) ;
USART_SendData(USART1
,0x02) ; 這樣通過上位機收到的只是
02并不是
00 01 02
因為數據還來不及發送,數據就被后面來的數據覆蓋了,所以收到的數據是02,不是00 01 02
USART_SendData(USART1
,0x00) ;
delay_ms(1);
USART_SendData(USART1
,0x01) ;
delay_ms(1);
USART_SendData(USART1
,0x02) ;
delay_ms(1); 這樣收到的才是
00 01 02
這個是個蠢辦法,但是由于本人也還沒理解那么多,就先用著,后面鏈接就是參考來源,里面有一個更好的設置辦法。
參考
然后是接收函數
USART_RX_BUF
[0]==0x02;
這個函數我也放個鏈接個需要的同學參考
STM32通過串口控制LED閃爍或者呼吸效果
這邊也有一個問題,由于protues仿真只能讀取第一一個字符,所以后面調試過程我基本都是使用串口模擬器,讓計算機來調試。
然后是主函數的東西,由于我寫的比較亂就放出一個給別人參考后面放源程序鏈接給同學。
int main(void){ vu8 key
=0; u8 t
;u8 len
; u16 times
=0; Stm32_Clock_Init(9);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2
);
uart_init(9600);
LED_Init(); KEY_Init();for(t
=0;t
<10;t
++){Array
[t
]=t
;}while(1){
if(USART_RX_BUF
[0]==0x01)
{
hxf_delay_s(10);
LED4
=!LED4
;
hxf_delay_s(10);USART_SendData(USART1
, 0x01);
hxf_delay_s(10);USART_SendData(USART1
, 0x01);
hxf_delay_s(10);USART_SendData(USART1
, 0x02);
hxf_delay_s(10);USART_SendData(USART1
, 0x03);
hxf_delay_s(10);USART_SendData(USART1
, 0xaa);
}
key
=KEY_Scan(0); if(key
){ switch(key
){ case KEY2_PRES
:
delay_ms(1000);LED4
=!LED4
;
hxf_delay_s(10);USART_SendData(USART1
, 0x01);
hxf_delay_s(10);USART_SendData(USART1
, 0x01);
hxf_delay_s(10);USART_SendData(USART1
, 0x02);
hxf_delay_s(10);USART_SendData(USART1
, 0x03);
hxf_delay_s(10);USART_SendData(USART1
, 0xaa);}break;}}
這里面由于原本的時鐘不知道為什么定時不精確,也沒去深究,就自己按原本那個寫了一個新的放進main.c函數里面了。
這樣程序部分就完成了。
然后是仿真部分,先上一份仿真圖
這里面的stm32需要設置72MHZ,然后由于virtual teminal會吞掉信號,所以我們不使用他,后面看波形,我們在用示波器看。
用串口模擬器和xcom調試看看運行如何。
發現符合要求,這邊仿真圖看看就行,因為protues的局限性太大了,這是我目前能做出來最完美的一份,然后兩塊單片機交互時候,大家可以自行用protues去嘗試,也是能成功的,希望對大家有用。
資源下載
QQ3209448656
總結
以上是生活随笔為你收集整理的两块stm32仿真protues串口通信程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。