日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两块stm32仿真protues串口通信程序

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两块stm32仿真protues串口通信程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是本人一個作業,卻整整花了兩天時間才搞完,因為網上關于stm32的仿真很少,所以應該是網上第一份protues兩塊單片機實現串口交互的程序,實在是值得紀念一下。
前文提要,由于protues仿真庫函數bug太多,所以采用寄存器的初始化版本原作者
后面會發原程序下載地址
首先我們知道串口交互程序需要uasrt初始化,這邊采用的是原子哥的例程實驗四的初始化,這個可以自行參考資料,這邊就不放代碼圖了。
led和key配置,這邊放兩個的.h代碼就好

//led.h #define LED5 PBout(4)// PB4 #define LED4 PBout(5)// PB5 #define LED3 PBout(6)// PB6void LED_Init(void);//初始化 //key.h #define KEY0 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)//讀取按鍵0 #define KEY1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)//讀取按鍵1 #define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)//讀取按鍵2 #define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)//讀取按鍵3 #define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)//讀取按鍵4#define KEY0_PRES 1 //KEY0按下 #define KEY1_PRES 2 //KEY1按下 #define KEY2_PRES 3 //KEY2按下 #define KEY3_PRES 4 //KEY3按下 #define KEY4_PRES 5 //KEY4按下

這兩個初始化程序也是原子哥的,可以自行找代碼參考如何實現。


這個是作業內容,但是問題是如何實現
按鍵控制實現比較簡單,如何實現發送信號和接收信號是一個問題
首先必須知道usar的函數是如何實現,這邊就介紹我們需要的發送和接收就好。

//USART_SenData void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) {/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_DATA(Data)); /* Transmit Data */USARTx->DR = (Data & (uint16_t)0x01FF); } //例子 //USART_SendData(USART1, 0x00); //發送0x02

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//當第一個字符為0x02時

這個函數我也放個鏈接個需要的同學參考
STM32通過串口控制LED閃爍或者呼吸效果
這邊也有一個問題,由于protues仿真只能讀取第一一個字符,所以后面調試過程我基本都是使用串口模擬器,讓計算機來調試。
然后是主函數的東西,由于我寫的比較亂就放出一個給別人參考后面放源程序鏈接給同學。

int main(void){ vu8 key=0; u8 t;u8 len; u16 times=0; Stm32_Clock_Init(9); //系統時鐘設置 // delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設置中斷優先級分組2 uart_init(9600); //串口初始化為9600 LED_Init(); //初始化與LED連接的硬件接口 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); } //輸如代碼和USART_RX_BUF key=KEY_Scan(0); //得到鍵值if(key){ switch(key){ case KEY2_PRES: //控制LED4點亮 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;}} //key2 、led1和USART_SendData

這里面由于原本的時鐘不知道為什么定時不精確,也沒去深究,就自己按原本那個寫了一個新的放進main.c函數里面了。
這樣程序部分就完成了。
然后是仿真部分,先上一份仿真圖

這里面的stm32需要設置72MHZ,然后由于virtual teminal會吞掉信號,所以我們不使用他,后面看波形,我們在用示波器看。
用串口模擬器和xcom調試看看運行如何。



發現符合要求,這邊仿真圖看看就行,因為protues的局限性太大了,這是我目前能做出來最完美的一份,然后兩塊單片機交互時候,大家可以自行用protues去嘗試,也是能成功的,希望對大家有用。
資源下載
QQ3209448656

總結

以上是生活随笔為你收集整理的两块stm32仿真protues串口通信程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。