【NUCLEO-WB09KE评测】2、UART中断方式串口通信
<p><strong><span style="font-size:18px;">目标</span></strong></p><p>为NUCLEO-WB09KE搭建基本环境,驱动LED、UART,实现UART中断方式串口通信。</p>
<p>跑通编译、下载流程,建立信心,为后面评测做好准备。</p>
<p> </p>
<p><strong><span style="font-size:18px;">一、STM32CubeMX配置</span></strong></p>
<p>MX新建一个工程,选择NUCLEO-WB09KE开发板</p>
<div style="text-align: center;"></div>
<p>由于选择了开发板,涉及BSP的部分已经配置好了,缺省的引脚也做了预留。</p>
<p> </p>
<p><strong><span style="font-size:16px;">1、BSP配置</span></strong></p>
<div style="text-align: center;"></div>
<p>勾选了LED,BUTTON,因为要用中断方式实现UART,所以没有勾选VCOM。</p>
<p> </p>
<p><strong><span style="font-size:16px;">2、USART1配置</span></strong></p>
<p>设置了中断方式</p>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<p><strong>生成代码</strong></p>
<p> </p>
<p><span style="font-size:18px;"><strong>二、代码修改</strong></span></p>
<p><strong>1、实现printf重定向</strong></p>
<p>据说ARM官方推荐用retarget.c的方式实现printf重定向</p>
<p>从keil/arm/startup/拷贝一份retarget.c到Core\Src下</p>
<div style="text-align: center;"></div>
<div>为了支持ARM6.xx编译,将retarget.c做如下修改</div>
<div>
<pre>
<code class="language-cpp">//#pragma import(__use_no_semihosting_swi)
__asm(".global __use_no_semihosting");
//extern intgetkey(void); /* in Serial.c */
//struct __FILE { int handle; /* Add whatever you need here */ };
//int fgetc(FILE *f) {
//return (sendchar(getkey()));
//}
</code></pre>
<p>main.c中增加:</p>
<pre>
<code>/* USER CODE BEGIN 0 */
int sendchar(int ch)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
return ch;
}
/* USER CODE END 0 */</code></pre>
<p> </p>
<p><span style="font-size:16px;"><strong>2、配置USART中断接收</strong></span></p>
<p>USART1初始化完成后,使能接收中断。</p>
<pre>
<code class="language-cpp">MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
// 使能UART中断
if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}</code></pre>
<p>增加中断接收处理回调函数:</p>
<p>HAL_UART_RxCpltCallback在aRxBuffer缓存接收满后一次。因此RXBUFFERSIZE被设置为1,这样每接收一个字符,HAL_UART_RxCpltCallback被调用一次。</p>
<p>当接收到1时,翻转绿灯。</p>
<p>为了下一次中断,需要再次设置HAL_UART_Receive_IT。</p>
</div>
<pre>
<code class="language-cpp">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if (UartHandle->Instance == USART1)
{
// 处理接收到的数据
// aRxBuffer 是存储接收数据的缓冲区
if(aRxBuffer==1)
{
//printf("HAL_UART_RxCpltCallback\r\n");
BSP_LED_Toggle(LED_GREEN);
aRxBuffer=0;
}
// 重新使能中断以继续接收数据
if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}
}
}
</code></pre>
<p><span style="font-size:18px;">三、运行效果</span></p>
<div style="text-align: center;"></div>
<p>1、串口收到信息。2、通过串口向MCU发送1,绿灯翻转。</p>
<p>UART中断方式串口通信测试比较完美</p>
<p>学习了,感谢大佬分享!</p>
页:
[1]