完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
(一)阻塞收发
使用示例 以HAL_UART_Transmit_IT为例 考虑到初始化代码可以用CubeMX生成,为方便理解,省略了初始化代码 int main(void) { /*初始化(已省略)*/ uint8_t uartbuff[20] = "test uart"; while (1) { HAL_UART_Transmit(&huart1,uartbuff,20,10); } } 在串口中使用printf()和scanf() 包含头文件 #include "stdio.h" 重定义 fputc 以使用 printf() int fputc(int c,FILE * f) { HAL_UART_Transmit(&huart1,(uint8_t *)&c,1,20);// 此处以阻塞发送为例,也可以使用其他两种方式 return c; } 重定义fgetc以使用scanf() int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xffff);// 此处以阻塞接收为例,也可以使用其他两种方式 return ch; } 完成重定义后,就可以在代码中使用printf()和scanf()了,使用方法同寻常c语言编程相同,输入和输出通过串口实现,可以使用串口调试助手进行查看和操作。 回头看整个流程 分析一下main.c文件,从头往下看,为方便阅读,删去了CubeMX生成的注释 #include "main.h" #include "dma.h" #include "usart.h" #include "gpio.h" #include "stdio.h" void SystemClock_Config(void); /*此处重定义fputc和fgetc*/ int fputc(int c,FILE * f) { HAL_UART_Transmit(&huart1,(uint8_t *)&c,1,20); return c; } int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xffff); return ch; } int main(void) { /****************这部分代码可以使用CubeMX生成******************************/ /* 复位所有外设,初始化Flash接口和Systick */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化所有已配置的外设,可以看到这里使用的是MX_XX_Init(),也就是调用使用CubeMX配置生成的初始化设置 */ MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); /****************这部分代码可以使用CubeMX生成******************************/ /* 进入while循环,执行用户逻辑 */ while (1) { printf("test uartn"); } } 回调函数 UART的中断收发和DMA收发提供了回调函数,当达到相应的条件后,会触发回调函数,用户可以在回调函数中编写自己需要实现的功能 例如:当使用HAL_UART_Transmit_IT()完成发送后,会触发HAL_UART_TxCpltCallback 回调函数,用户可以在HAL_UART_TxCpltCallback中编写代码实现自己需要的功能。 值得注意的是,回调函数是使用弱定义关键字weak实现的,用户需要重定义实现回调函数。 __weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE: This function should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ } 常见回调函数: HAL_UART_TxCpltCallback HAL_UART_RxCpltCallback HAL_UART_TxHalfCpltCallback HAL_UART_RxHalfCpltCallback HAL_UART_ErrorCallback |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
633 浏览 0 评论
3336 浏览 9 评论
3013 浏览 16 评论
3506 浏览 1 评论
9098 浏览 16 评论
1216浏览 3评论
631浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
619浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2361浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1925浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 09:44 , Processed in 1.047480 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号