概述
本文利用中斷實現串口不定長接收(非DMA),使用HAL庫,將接收的數據打印出去。
DMA接收請查看:https://blog.csdn.net/qq_24312945/article/details/106557538
硬件準備
首先需要準備一個開發板,這里我準備的是NUCLEO-F030R8的開發板:
選擇芯片型號
使用STM32CUBEMX選擇芯片stm32f030r8,如下所示:
配置時鐘源
HSE與LSE分別為外部高速時鐘和低速時鐘,在本文中使用內置的時鐘源,故都選擇Disable選項,如下所示:
配置時鐘樹
STM32F0的最高主頻到48M,所以配置48即可:
串口配置
本次實驗使用的串口1進行串口通信,波特率配置為115200。
中斷
GPIO配置
定時器配置
本次實驗使用的是TIM3來進行計數。
PWM頻率計算如下所示
在上面配置TIM3參數,預分頻系數設置為480-1, 自動重載值設置為10000-1,那么PWM頻率為48,000,000/((480-1+1)*(10000-1+1))=10Hz,即 100ms一個周期。
生成工程設置
注意在生成工程設置中不能出現中文,不然會報錯。
代碼生成設置
最后設置生成獨立的初始化文件:
生成代碼
配置keil
代碼
在main.c中,先加入頭文件。
/* USER CODE BEGIN Includes */
#include "stdio.h"//printf頭文件
#include "string.h"//memset頭文件
/* USER CODE END Includes */
定義變量存儲。
/* USER CODE BEGIN PV */
uint8_t RxBuff[1]; //進入中斷接收數據的數組
uint8_t DataBuff[5000]; //保存接收到的數據的數組
int RxLine=0; //接收到的數據長度
int Rx_flag=0; //接受到數據標志
/* USER CODE END PV */
定義printf的重定向函數fputc。
/* USER CODE BEGIN 0 */
void printf_usart(void);//輸出內容
int fputc(int ch, FILE* file)//定義printf的重定向函數fputc,滿足串口調試打印
{
return HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);
}
/* USER CODE END 0 */
打開串口和定時器。
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //打開串口中斷接收
HAL_TIM_Base_Start_IT(&htim3);//開啟定時器
/* USER CODE END 2 */
串口接受代碼,當接受到最后數據為FF時候,直接打印,否則等待100ms打印。
/* USER CODE BEGIN 4 */
void printf_usart(void)
{
printf("數據長度=%d
",RxLine);
for(int i=0;iprintf("數據:[%d] = 0x%x
",i,DataBuff[i]);
memset(DataBuff,0,sizeof(DataBuff)); //清空緩存數組
//memset()作用:可以方便的清空一個結構類型的變量或數組。
//例句:memset(aTxbuffer,0,sizeof(aTxbuffer)) 用memset清空aTxbuffer。
RxLine=0; //清空接收長度
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
/* Toggle LED */
if(Rx_flag==1)
{
printf_usart();
Rx_flag=0;
}
}
}
// 捕獲中斷回調函數,每次捕獲到信號就會進入這個回調函數
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{
RxLine++; //每接收到一個數據,進入回調數據長度加1
DataBuff[RxLine-1]=RxBuff[0]; //把每次接收到的數據保存到緩存數組
Rx_flag=1;
if(RxBuff[0]==0xff) //接收結束標志位,這個數據可以自定義,根據實際需求,這里只做示例使用,不一定是0xff
{
printf_usart();
}
RxBuff[0]=0;
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一個數據,就打開一次串口中斷接收,否則只會接收一個數據就停止接收
__HAL_TIM_SET_COUNTER(&htim3, 1); // 計數清零,從頭開始計
}
/* USER CODE END 4 */
演示效果
可以看到 發送11 12 13需要等待100ms左右才能發送,如果最后加上ff直接發送。
審核編輯:湯梓紅
-
定時器
+關注
關注
23文章
3255瀏覽量
115373 -
USART
+關注
關注
1文章
195瀏覽量
30969 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
15005
發布評論請先 登錄
相關推薦
STM32CUBEMX(2)--USART通過DMA方式接收不定長數據
STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據
【MCU】基于STM32CubeMX定時器中斷實現LED閃爍
![【MCU】基于<b class='flag-5'>STM32CubeMX</b><b class='flag-5'>定時器</b><b class='flag-5'>中斷</b>實現LED閃爍](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEMX(2)--USART通過DMA方式接收不定長數據
![<b class='flag-5'>STM32CUBEMX</b>(2)--<b class='flag-5'>USART</b><b class='flag-5'>通過</b>DMA<b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 HAL庫中串口空閑中斷+DMA 實現串口數據的不定長接收
![<b class='flag-5'>STM32</b> HAL庫中串口空閑<b class='flag-5'>中斷</b>+DMA 實現串口<b class='flag-5'>數據</b>的<b class='flag-5'>不定長</b><b class='flag-5'>接收</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX HAL庫串口+DMA+IDLE空閑中斷不定長度數據接收和發送
![<b class='flag-5'>STM32CubeMX</b> HAL庫串口+DMA+IDLE空閑<b class='flag-5'>中斷</b><b class='flag-5'>不定長度數據</b><b class='flag-5'>接收</b>和發送](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32+串口空閑中斷實現不定長數據接收
![<b class='flag-5'>STM32</b>+串口空閑<b class='flag-5'>中斷</b>實現<b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論