久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5597|回復(fù): 3
收起左側(cè)

[零基礎(chǔ)學(xué)習(xí)STM32]第四講:UART通訊實驗—控制LED

[復(fù)制鏈接]
ID:278743 發(fā)表于 2018-3-2 17:18 | 顯示全部樓層 |閱讀模式
一、概述
1、UART簡介
  UART:通用同步/異步串行接收/發(fā)送器,由時鐘發(fā)生器、數(shù)據(jù)發(fā)送器和接收器三大部分組成。UART是一個全雙工通用同步/異步串行收發(fā)模塊,該接口是一個高度靈活的串行通信設(shè)備。STM32F407IGT6具有6個UART收發(fā)器,可使用相應(yīng)的代碼使能后使用。
2、UART特點(diǎn)
  • 全雙工操作(相互獨(dú)立的接收數(shù)據(jù)和發(fā)送數(shù)據(jù))。
  • 同步操作時,可主機(jī)時鐘同步,也可從機(jī)時鐘同步。
  • 支持8和9位數(shù)據(jù)位,1或2位停止位的串行數(shù)據(jù)楨結(jié)構(gòu)。
  • 由硬件支持的奇偶校驗位發(fā)生和檢驗。
  • 數(shù)據(jù)溢出檢測。
  • 幀錯誤檢測。
  • 包括錯誤起始位的檢測噪聲濾波器和數(shù)字低通濾波器。
  • 三個完全獨(dú)立的中斷,TX發(fā)送完成、TX發(fā)送數(shù)據(jù)寄存器空、RX接收完成。
  • 支持多機(jī)通信模式。
  • 支持倍速異步通信模式。
3、UART時序
           圖4_0 UART時序
空閑位:高電平。
啟動位:一個低電平。
字符數(shù)據(jù):可以選擇8和9位數(shù)據(jù)位。
奇偶校驗位:根據(jù)需要選擇是否進(jìn)行校驗。
停止位:一個高電平。
4、TTL、RS232、RS485、RS422通信
TTL、RS232、RS485都是指電平信號,USART可使用相應(yīng)的電平轉(zhuǎn)換芯片,實現(xiàn)這三種通信。
  • TTL:電平信號數(shù)據(jù)表示采用二進(jìn)制規(guī)定,+5V等價于邏輯“1”,0V等價于邏輯“0”。通訊方式為全雙工通信。
  • RS232:232中任何一條信號線的電壓均為負(fù)邏輯關(guān)系。即:邏輯“1”為-3到-15V;邏輯“0”為+3到+15V。通訊方式為全雙工,通訊距離15m,RS-232的數(shù)據(jù)最高傳輸速率為20Kbps。
  • RS485:RS485采用差分信號負(fù)邏輯,邏輯"1”以兩線間的電壓差為-(2~6)V表示;邏輯"0"以兩線間的電壓差為+(2~6)V表示。通訊方式為半雙工,通訊距離1200m,RS-485的數(shù)據(jù)最高傳輸速率為10Mbps。
  • RS422:RS422采用兩對差分線傳輸數(shù)據(jù),電平與RS485相同。通訊方式為全雙工,通訊距離1200m,RS-422的數(shù)據(jù)最高傳輸速率為10Mbps。
二、硬件電路

                圖4_1UART引腳圖
             圖4_2UART轉(zhuǎn)USB
  本試驗使用的芯片STM32F407IGT6,使用UART為UART_4,引腳位PA0和PA1,經(jīng)過串口轉(zhuǎn)USB芯片CH340轉(zhuǎn)換后,可通過USB接口與計算機(jī)通訊。
三、 實驗原理
  計算機(jī)安裝 CH340 驅(qū)動后,可通過串口工具來接收串口發(fā)送的數(shù)據(jù)和向串口發(fā)送給數(shù)據(jù)。用串口工具打開iCore3對應(yīng)的端口,波特率設(shè)為115200,發(fā)送相應(yīng)的命令,便可以控制ARM LED的亮滅情況。串口命令如下表:
表4_1: 串口控制命令
LED_RED_ON\cr\lf
LED 紅燈亮
LED_RED_OFF\cr\lf
LED 紅燈滅
LED_BLUE_ON\cr\lf
LED 藍(lán)燈亮
LED_BLUE_OFF\cr\lf
LED 藍(lán)燈滅
LED_GREEN_ON\cr\lf
LED 綠燈亮
  LED_GREEN_OFF\cr\lf
LED 綠燈滅

                          圖:4_3 控制實例
四、源代碼
1.USART初始化結(jié)構(gòu)體介紹
  1. typedefstruct
  2. {
  3. uint32_tUSART_BaudRate;           
  4. uint16_tUSART_WordLength;         
  5. uint16_tUSART_StopBits;           
  6. uint16_tUSART_Parity;              
  7. uint16_tUSART_Mode;               
  8. uint16_tUSART_HardwareFlowControl;
  9. } USART_InitTypeDef;
復(fù)制代碼
  • 波特率:每秒傳輸?shù)亩M(jìn)制位個數(shù)。
  • 數(shù)據(jù)長度:可選擇8位,9位。
  • 停止位:可選擇0.5位、1位、1.5位和2位。
  • 校驗位:可選擇無校驗、奇校驗、偶檢驗。
  • USART模式:可選擇接收模式、發(fā)送模式、收發(fā)模式。

2.主函數(shù)
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         inti;
  17.         char buffer[20];
  18.         led.initialize();
  19.         usart4.initialize(9600);
  20.         usart4.printf("hello! I am iCore3!\r\n");                              //串口4輸出
  21.         while(1){
  22.                 if(usart4.receive_ok_flag){                                          //接收完成
  23. usart4.receive_ok_flag = 0;
  24.                         for(i = 0;i <20;i++){
  25.                                 buffer[i] = tolower(usart4.receive_buffer[i]);
  26.                         }
  27.                         //比較接收信息
  28.                         if(memcmp(buffer,"led_red_on",strlen("led_red_on")) == 0){
  29.                                 LED_RED_ON;
  30.                                 usart4.printf("ok!\r\n");
  31.                         }
  32.                         if(memcmp(buffer,"led_red_off",strlen("led_red_off")) == 0){
  33.                                 LED_RED_OFF;
  34.                                 usart4.printf("ok!\r\n");
  35.                         }
  36.                         if(memcmp(buffer,"led_green_on",strlen("led_green_on")) == 0){
  37.                                 LED_GREEN_ON;
  38.                                 usart4.printf("ok!\r\n");
  39.                         }
  40.                         if(memcmp(buffer,"led_green_off",strlen("led_green_off")) == 0){
  41.                                 LED_GREEN_OFF;
  42.                                 usart4.printf("ok!\r\n");
  43.                         }
  44.                         if(memcmp(buffer,"led_blue_on",strlen("led_blue_on")) == 0){
  45.                                 LED_BLUE_ON;
  46.                                 usart4.printf("ok!\r\n");
  47.                         }
  48.                         if(memcmp(buffer,"led_blue_off",strlen("led_blue_off")) == 0){
  49.                                 LED_BLUE_OFF;
  50.                                 usart4.printf("ok!\r\n");
  51.                         }
  52.                 }
  53.         }
  54. }
復(fù)制代碼
3.USART初始化及相關(guān)配置
  1. /*
  2. * Name               : initialize_usart4
  3. * Description        : ---
  4. * Author             : XiaomaGee
  5. *
  6. * History
  7. * -------------------
  8. * Rev                : 0.00
  9. * Date               : 11/21/2015
  10. *
  11. * create.
  12. * -------------------
  13. */
  14. staticint initialize_usart4(unsignedlongintbaudrate)
  15. {
  16.         GPIO_InitTypeDefGPIO_InitStructure;
  17.         USART_InitTypeDefUSART_InitStructure;
  18.         NVIC_InitTypeDef NVIC_InitStructure;

  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);             // GPIO時鐘使能

  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                        //PA0為復(fù)用推挽輸出
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                        //PA1為浮空輸入
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  28.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_UART4);           //PA0引腳復(fù)用為UART4
  29.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_UART4);           //PA1引腳復(fù)用為UART4

  30.         USART_DeInit(UART4);
  31.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);            //UART4時鐘使能
  32. USART_InitStructure.USART_BaudRate = baudrate;                   //波特率
  33.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;      //8個數(shù)據(jù)位
  34.         USART_InitStructure.USART_StopBits = USART_StopBits_1;           //1個停止位
  35.         USART_InitStructure.USART_Parity = USART_Parity_No ;             //無奇偶校驗位
  36.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  37.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //收發(fā)模式
  38.         USART_Init(UART4, &USART_InitStructure);                         //初始化UART4
  39.         USART_Cmd(UART4, ENABLE);                                        //使能UART4
  40.         USART_ITConfig(UART4,USART_IT_PE,ENABLE);
  41.         USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);                      //打開UART4的中斷

  42.         NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
  43.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  44.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  45.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  46.         NVIC_Init(&NVIC_InitStructure);

  47.         return0;
  48. }
  49. /*
  50. * Name               : send_buffer4
  51. * Description        : ---
  52. * Author             : XiaomaGee
  53. *
  54. * History
  55. * -------------------
  56. * Rev                : 0.00
  57. * Date               : 11/21/2015
  58. *
  59. * create.
  60. * -------------------
  61. */
  62. staticint
  63. send_buffer4(void * buf,intlen)
  64. {
  65.         char *p = (char *)buf;

  66.         if(len<= 0)return -1;

  67.         while(len --){
  68.                 send_byte_to_usart4(*p);
  69.                 p ++;
  70.         }
  71.         return0;
  72. }

  73. /*
  74. * Name               : send_byte_to_usart4
  75. * Description        : ---
  76. * Author             : XiaomaGee
  77. *
  78. * History
  79. * -------------------
  80. * Rev                : 0.00
  81. * Date               : 11/21/2015
  82. *
  83. * create.
  84. * -------------------
  85. */
  86. staticint
  87. send_byte_to_usart4(char data)                  //TTL通信
  88. {
  89.         while(!(USART_GetFlagStatus(UART4,USART_FLAG_TC) == 1));          //等待發(fā)送數(shù)據(jù)完成
  90.         USART_SendData(UART4,data);                                       //將數(shù)據(jù)寫入數(shù)據(jù)寄存器中

  91.         return0;
  92. }

  93. /*
  94. * Name               : send_string_to_usart4
  95. * Description        : ---
  96. * Author             : XiaomaGee
  97. *
  98. * History
  99. * -------------------
  100. * Rev                : 0.00
  101. * Date               : 11/21/2015
  102. *
  103. * create.
  104. * -------------------
  105. */
  106. staticint
  107. send_string_to_usart4(char * str)
  108. {
  109.         while(*str!='\0'){
  110.                 while(!(USART_GetFlagStatus(UART4,USART_FLAG_TC) == 1));
  111.                 USART_SendData(UART4,*str++);
  112.         }
  113.         return0;
  114. }
  115. /*
  116. * Name               : UART4_IRQHandler
  117. * Description        : ---
  118. * Author             : XiaomaGee
  119. *
  120. * History
  121. * -------------------
  122. * Rev                : 0.00
  123. * Date               : 11/21/2015
  124. *
  125. * create.
  126. * -------------------
  127. */
  128. int
  129. UART4_IRQHandler(void)
  130. {
  131. while(USART_GetFlagStatus(UART4,USART_FLAG_RXNE) == 0);
  132.         usart4.receive_buffer[usart4.counter++]=USART_ReceiveData(UART4); //接收數(shù)據(jù)

  133.         if(usart4.receive_buffer[usart4.counter - 1] == '\n'&& usart4.receive_buffer[usart4.counter - 2] == '\r'){
  134.                         usart4.receive_buffer[usart4.counter-1]=0;
  135.                         usart4.counter=0;
  136.                 usart4.receive_ok_flag=1;
  137. return0;
  138. }
  139. /*
  140. * Name               : printf
  141. * Description        : ---
  142. * Author             : XiaomaGee
  143. *
  144. * History
  145. * -------------------
  146. * Rev                : 0.00
  147. * Date               : 11/21/2015
  148. *
  149. * create.
  150. * -------------------
  151. */
  152. staticint
  153. my_printf4(constchar * fmt,...)                             //串口4輸出
  154. {
  155.         __va_listarg_ptr;
  156.         charbuf[UART_BUFFER_SIZE];

  157.         memset(buf,'\0',sizeof(buf));

  158.         va_start(arg_ptr,fmt);
  159.         vsprintf(buf,fmt,arg_ptr);
  160.         va_end(arg_ptr);

  161.         send_string_to_usart4(buf);

  162.         return0;
復(fù)制代碼
五、 實驗現(xiàn)象
通過串口調(diào)試工具輸入相應(yīng)的命令,可以看到iCore3執(zhí)行相應(yīng)的明命令,LED按控制命令亮滅。
六、代碼包下載
iCore3_4_USART.rar (1.55 MB, 下載次數(shù): 27)
回復(fù)

使用道具 舉報

ID:593616 發(fā)表于 2019-9-10 18:37 | 顯示全部樓層
寫的好
回復(fù)

使用道具 舉報

ID:332280 發(fā)表于 2020-7-2 08:57 | 顯示全部樓層
51hei凈出好東西
回復(fù)

使用道具 舉報

ID:797825 發(fā)表于 2020-7-5 15:57 | 顯示全部樓層
挺好的,如果有加更全的通信協(xié)議就好了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美a视频| 午夜免费在线电影 | 亚洲一区二区电影网 | 伊人久麻豆社区 | 中文字幕亚洲视频 | 午夜在线观看视频 | 九九热九九 | 酒色成人网 | 午夜精品久久久久久不卡欧美一级 | 日韩欧美在线一区 | 日韩不卡在线 | 免费的av网站 | 国产区精品在线观看 | 在线视频一区二区三区 | 视频一区在线 | 视频一区二区在线观看 | 国产精品国产a级 | 午夜私人影院 | 成人在线视频观看 | 99精品视频在线 | 91中文字幕在线观看 | www精品 | 亚洲国产一区二区三区在线观看 | 国产ts人妖另类 | 婷婷福利视频导航 | 成人欧美一区二区三区在线观看 | 最新中文字幕在线 | 国产视频在线一区二区 | 日韩av中文 | 亚洲精品久久久一区二区三区 | 视频一区二区在线 | 日韩精品一区二区三区在线播放 | 日本 欧美 三级 高清 视频 | 狠狠伊人| 国产精品99久久免费观看 | 性色av一区| 日韩精品 电影一区 亚洲 | 久久久久亚洲精品国产 | 一区免费| www.亚洲.com| 日韩免费av一区二区 |