欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STM32串口教程 [打印本頁]

作者: pigpigfang    時間: 2021-2-1 16:43
標題: STM32串口教程
使用CubeMX配置串口1配置引腳

  我的板子上使用插針引出了串口1,串口1連接PA8與PA9。

配置串口通信參數

  使能串口1,并配置為同步模式,波特率為115200,模式8N1。

使能串口中斷

查看生成的代碼

  引腳與中斷的初始化在stm32f4xx_hal_msp.c

  而通信用到的參數,如波特率校驗方式等初始化在main.c。

  同樣是串口初始化的代碼,為什么要分開寫?
  可能是分層思想,換板子的話,只用修改引腳與中斷的函數,用戶函數不用修改。比如用戶關心波特率,不用關心引腳。

按鍵控制串口發(fā)送代碼編寫

  通過串口打印按鍵的信息。

//main.cint main(void){  /* USER CODE BEGIN 2 */  u8 UART_BUF[12 = "you press A!";  u8 key;  /* USER CODE END 2 */  while (1)  {    key = KEY_Scan(0);    switch(key)    {      case KEY_A_PRES:  UART_BUF[10 = 'A'; break;      case KEY_B_PRES:  UART_BUF[10 = 'B'; break;      case KEY_C_PRES:  UART_BUF[10 = 'C'; break;      case KEY_D_PRES:  UART_BUF[10 = 'D'; break;      default: break;         }    if(key)    {      LED1 = !LED1;      HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff);       }    /* USER CODE END WHILE */  }}

  HAL_UART_Transmit是HAL庫提供的串口發(fā)送函數。在HAL庫的手冊中,或者在代碼中跳轉到函數可以找到函數的說明信息。

  根據說明,這個發(fā)送函數是阻塞式的。參數Timeout是超時時間,代表某次執(zhí)行函數,最多占用串口的時間,單位是毫秒。簡單來說,在本次數據發(fā)送完之前,不能發(fā)送別的數據。所以,調用函數的時候要指明參數,本次發(fā)送占用多長時間,在此期間,由于串口資源被獨占,不能成功調用發(fā)送函數。如果在規(guī)定的時間內,數據發(fā)送完畢,那就釋放占用的串口資源;如果到了時間,即便數據還沒有發(fā)送完畢,(比如數據量很大),仍需要歸還串口資源的控制權,讓別人來用。
  在正確連接硬件,并配置串口助手以后,可以看到按鍵信息如下,說明串口數據發(fā)送成功。

  需要說明的是,HAL庫提供的發(fā)送函數不止一個,還有中斷方式和DMA方式,這是這個函數用法最簡單。

重映射Printf功能

  在剛剛的例子中,需要把字符裝填到數組中,再通過數組來發(fā)送數據,比較麻煩,能否直接打印字符串?可以通過重映射C語言中的printf函數來實現。
  建立一個UART.c文件,添加到工程中。輸入以下代碼:

#include "stdio.h"#include "main.h"#ifdef __GNUC_#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif//重映射printf的功能PUTCHAR_PROTOTYPE{  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);   return ch;}

  注意在適當的地方要有huart1的外部聲明。我寫在了main.h中
extern UART_HandleTypeDef huart1;
  然后在主函數中可以調用printf。

//main() while(1)    if(key)    {      LED1 = !LED1;      printf("return value is %d! \r\n",key);      HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff);    //發(fā)送接收到的數據    }

引腳復用與功能重映射

  如果在STM32CubeMX中將PB6設置為串口功能,可以發(fā)現PA9變?yōu)榱似胀ㄒ_。

  這說明PA9和PB6都可以作為串口1的TX引腳,但不能同時用。引腳有點像外設的出口,外設可以從前門出,也可以從后門出,但不能同時從前門和后門出去。
  引腳的功能不止一個,我們可以稱之為引腳的復用;比如既可以作為普通的IO,用于操作LED或按鍵,又可以用作串口。
  某個外設不但可以連接到引腳x,也可以用到引腳y,我們稱之為重映射。STM32單片機的功能比較強大,有很多外設。外設默認對應某個引腳,可以通過重映射的方法把一個外設映射到其它的引腳上,來充分利用片內資源。
  詳細的引腳重映射情況可以查看數據手冊表格9。

引用鏈接:https://blog.csdn.net/geek_monke ... 1001.2014.3001.5501







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1