sujingliang 发表于 2024-9-17 19:26

【NUCLEO-WB09KE评测】2、UART中断方式串口通信

<p><strong><span style="font-size:18px;">目标</span></strong></p>

<p>为NUCLEO-WB09KE搭建基本环境,驱动LED、UART,实现UART中断方式串口通信。</p>

<p>跑通编译、下载流程,建立信心,为后面评测做好准备。</p>

<p>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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(&amp;huart1,(uint8_t *)&amp;ch,1,0xffff);
        return ch;
}


/* USER CODE END 0 */</code></pre>

<p>&nbsp;</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(&amp;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-&gt;Instance == USART1)
{
    // 处理接收到的数据
    // aRxBuffer 是存储接收数据的缓冲区
                if(aRxBuffer==1)
                {
                        //printf("HAL_UART_RxCpltCallback\r\n");
                        BSP_LED_Toggle(LED_GREEN);
                        aRxBuffer=0;
                }
    // 重新使能中断以继续接收数据
                if (HAL_UART_Receive_IT(&amp;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>

Jacktang 发表于 2024-9-18 07:42

<p>UART中断方式串口通信测试比较完美</p>

慕容雪花 发表于 2024-9-19 20:11

<p>学习了,感谢大佬分享!</p>
页: [1]
查看完整版本: 【NUCLEO-WB09KE评测】2、UART中断方式串口通信