一、串口的配置
1)首先打开你的工程,在STM32Cube里面找到USART1,此时串口默认是Disanle的,我们要使能它,选择Asynchronous.
2)然后点击Configuration,就会有一个串口的配置图框,点进去配置串口,如果需要用到中断,选择NVIC进去进行相关配置。
串口配置:
串口中断使能:
点击NVIC选项,设置优先级和分组
二、查看串口内的函数API
Keil工程内选择{ }Functions,然后选择你需要查看的目标源文件,展开既是该源码内的函数
串口的发送接收函数:
HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();//串口中断模式发送
HAL_UART_Receive_IT();//串口中断模式接收
HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Receive_DMA();//串口DMA模式接收
串口相关的中断函数:
HAL_UART_TxHalfCpltCallback()://一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback()://发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback()://一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback():///接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback():/传输过程中出现错误时,通过中断处理函数调用。
串口有三种通信模式:
第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
三、在main.c文件添加printf支持
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 1 */
四、单独串口中断的使用
1)在main函数前面添加两个数组变量
uint8_t aTxStartMessage[] = "rn UART-communication based on IT rn";
uint8_t aRxBuffer[20];
/* USER CODE END PV */
2)在main函数中添加语句接收数据10个字符,保存在数组aRxBuffer中。
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//串口接收中断使能,如果要循环使用就放到while(1)里面
3)在main.c文件添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。
/* USER CODE BEGIN 4 */
/**
* @brief Rx Transfer completed callbacks
* @param huart: uart handle
* @retval None
*/
void HAL_UART_RxCpltCallback(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_RxCpltCallback can be implemented in the user file
*/
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//发送10个数据给串口1
HAL_UART_Receive_IT(&huart1,aRxBuffer,10); // 重新使能串口1接收中断
}
/* USER CODE END 4 */
五、多个串口同时使用
1)定义串口1和串口3的接收数据变量
2)中断回调函数
void HAL_UART_RxCpltCallback(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_RxCpltCallback can be implemented in the user file
*/
if(huart->Instance == USART1)//串口1做调试
{
// HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer1, 10,0xFFFF);
RECV_FLAG1 = 1;
HAL_UART_Receive_IT(&huart1,aRxBuffer1,10); // 再次串口接收中断使能
}
else if(huart->Instance == USART2)//串口2接蓝牙
{
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer2, 3,0xFFFF);
RECV_FLAG2 = 1;
HAL_UART_Receive_IT(&huart2,aRxBuffer2,3); //再次串口接收中断使能
}
}
3)主函数编写
Int mai(void)
{
While(1)
{
if(RECV_FLAG2 == 1)
{
RECV_FLAG2= 0;
Car_contrl(aRxBuffer2[0]); //控制协议cmd[3]:cmd[0]=控制码 cmd[1]=0xD cmd[2]= 0xA
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer1, 10); //串口1接收中断使能
HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer2, 3); //串口3接收中断使能,所以大小为3:0D 0A 01
}
}
--------------------------------------END-----------------------------------------------
上一篇:环形缓冲区stm32例程
下一篇:STM32 HAL库 printf输出重定向
推荐阅读
史海拾趣
尽管已经取得了显著的成就,但ConnectBlue公司并没有止步不前。相反,公司继续坚持创新驱动的发展战略,不断推出新产品、新技术和新服务。同时,公司还积极关注行业发展趋势和未来技术方向,为公司的长期发展做好充分准备。展望未来,ConnectBlue公司将继续致力于无线通信技术的研发和应用,为推动电子行业的进步和发展做出更大的贡献。
这五个故事展示了ConnectBlue公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到产品创新的突破、市场拓展的成功、被u-blox收购后的新跨越以及持续创新的未来展望,ConnectBlue公司始终保持着积极进取的精神和不断创新的态度,在无线通信领域取得了显著的成绩。
Accetek公司深知人才是企业发展的核心竞争力。因此,公司一直注重人才引进和团队建设工作。公司通过与高校合作、举办招聘会等方式吸引了一批批优秀的人才加入。同时,公司还建立了完善的培训机制和激励机制,为员工的成长和发展提供了良好的平台。这些优秀的人才为公司的技术创新和市场拓展提供了有力的支持。
2008年全球金融危机的爆发对ELPIDA造成了巨大冲击。由于DRAM需求的急剧下降和价格的暴跌,公司的业绩急剧恶化。在这种情况下,ELPIDA不得不采取一系列措施来应对困境,包括削减成本、优化生产流程等。然而,这些措施并未能完全扭转公司的颓势。
在追求经济效益的同时,捷嘉电子始终不忘履行社会责任。公司积极参与各种公益活动,支持教育事业和环保项目。此外,捷嘉电子还致力于推动行业的可持续发展,通过研发节能环保产品和技术创新来减少对环境的影响。这些举措不仅提升了公司的社会形象,也为电子行业的可持续发展做出了积极贡献。
请注意,以上故事是基于目前所了解的信息进行的虚构创作,并非真实事件。如有雷同,纯属巧合。同时,“Chequers Electronic”并非一个已知的公司名称,因此假设其指的是名为捷嘉的某电子行业相关企业。如需更多信息或详细故事,请提供更多背景资料或具体要求。
全智景公司自成立以来,一直致力于电子视觉技术的研发。早期,公司面临激烈的市场竞争和技术瓶颈,但全智景团队凭借坚韧不拔的精神,成功研发出了一款具有划时代意义的高清摄像头芯片。这款芯片以其出色的图像质量和稳定性,迅速获得了市场的认可,并推动了整个电子视觉行业的进步。这一技术突破不仅让全智景公司在市场上站稳了脚跟,也为公司后续的发展奠定了坚实的基础。
为了进一步提升公司的竞争力,全智景公司开始实施全球化战略。公司积极拓展海外市场,与多个国家和地区的企业建立了合作关系。通过引进国外先进的技术和管理经验,全智景公司不断提升自身的综合实力。同时,公司还积极参与国际展览和交流活动,提升了品牌知名度和影响力。这一全球化战略为全智景公司带来了更广阔的发展空间和市场机遇。
摘要: 介绍了3DES加密算法的原理并详尽描述了该算法的FPGA设计实现。采用了状态机和流水线技术,使得在面积和速度上达到最佳优化;添加了输入和输出接口的设计以增强该算法应用的灵活性。各模块均用硬件描述语言实现,最终下载到FPGA芯片Stratix E ...… 查看全部问答∨ |
|
本人欲采用外部的AD模块进行模数转换,ADC芯片是TI的ADS931——我的办法是数据口与430的IO直接连,这样连接是否有问题?第二个问题是ADS931的CLK引脚和430该如何连接?谢谢 [ 本帖最后由 周星星在哈工程 于 2011-8-23 14:58 编辑 ]… 查看全部问答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 02:59 编辑 我们的作品在家测试一切正常,用现场的恒压源测试,高于7V都没有问题,到5.5V测试时,输出电压一下降至2.7V,用万用表测量作品输入电压仅4.6V,而恒压源显示为5.5V,有遇到这种情况的同学进来讨论。获 ...… 查看全部问答∨ |
BBB突然就没办法启动了,现在插上电源,电源指示灯闪一下就灭了,我检查了下也没有短路,怎么会这样哇.正常电压如图所示,我现在的电压情况是:离GND最近的,也就是GND上面的那个是5V(图中显示正常值是5V),右侧的三个电容中中间那个是1.1v(图中显示 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 免费尝鲜:ST 双核无线 MCU STM32WB55 开发板
- 有奖直播|魏德米勒 OMNIMATE® 联接技术的创新发展
- 了解ADI电网管理、能源计量方案,答题赢Kindle、《新概念模拟电路》【世健的ADI之路主题游 能源站】
- 泰克直播:你真的了解示波器吗?
- 【ST直播】MEMS传感器开发套件简介、了解内嵌“有限状态机和机器学习内核”的传感器
- 打卡最后一周,解锁TI汽车解决方案。解锁的数量决定奖品的质量!
- 瑞萨电子边缘AI 技术研讨会——深圳站, 火热报名中,参会有好礼!
- 英飞凌考考你关于AI芯片的冷知识
- 下载设计资源,赢取“会说话”的啤酒托!
- 【EEWORLD第八届社区明星人物】10月明星人物
- SCHURTER PSE EX系列开关获得 ATEX / IECEx 认证,可用于防爆环境
- 扩大碳化硅供应,英飞凌联手GT Advanced Technologies
- 北京110个充电站将获2020年度第二批单位内部公用充电设施建设补助
- Counterpoint:安卓厂商难效仿苹果移除充电器
- 苹果发布TestFlight 3.0:支持自动更新
- 隼鸟2号将投放机器人 让机器人完成针对这颗小行星的贴地研究
- 服务机器人功能逐渐强大 未来行业市场前景广阔
- 弧焊机器人水平堪比大国工匠 未来有望大规模应用
- 短视行为不利于机器人技术的潜心研究和产业长期稳定发展
- 通过竞技机器人大规模投入 日后将在家用领域实现新的突破