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

標(biāo)題: STM32串口教程 [打印本頁]

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

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

配置串口通信參數(shù)

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

使能串口中斷

查看生成的代碼

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

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

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

按鍵控制串口發(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ā)送函數(shù)。在HAL庫的手冊中,或者在代碼中跳轉(zhuǎn)到函數(shù)可以找到函數(shù)的說明信息。

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

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

重映射Printf功能

  在剛剛的例子中,需要把字符裝填到數(shù)組中,再通過數(shù)組來發(fā)送數(shù)據(jù),比較麻煩,能否直接打印字符串?可以通過重映射C語言中的printf函數(shù)來實現(xiàn)。
  建立一個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;}

  注意在適當(dāng)?shù)牡胤揭衕uart1的外部聲明。我寫在了main.h中
extern UART_HandleTypeDef huart1;
  然后在主函數(shù)中可以調(diào)用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ā)送接收到的數(shù)據(jù)    }

引腳復(fù)用與功能重映射

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

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

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







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