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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1117|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32串口教程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:882115 發(fā)表于 2021-2-1 16:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
使用CubeMX配置串口1配置引腳

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

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

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

使能串口中斷

查看生成的代碼

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

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

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

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

  通過(guò)串口打印按鍵的信息。

//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 */  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

  HAL_UART_Transmit是HAL庫(kù)提供的串口發(fā)送函數(shù)。在HAL庫(kù)的手冊(cè)中,或者在代碼中跳轉(zhuǎn)到函數(shù)可以找到函數(shù)的說(shuō)明信息。

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

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

重映射Printf功能

  在剛剛的例子中,需要把字符裝填到數(shù)組中,再通過(guò)數(shù)組來(lái)發(fā)送數(shù)據(jù),比較麻煩,能否直接打印字符串?可以通過(guò)重映射C語(yǔ)言中的printf函數(shù)來(lái)實(shí)現(xiàn)。
  建立一個(gè)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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  注意在適當(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ù)    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

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

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表