教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

STM32f103C8T6入门学习记录(5)

来源:网络收集 时间:2026-07-17
导读: { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate= 115200; //配置波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //配置数据位 USART_InitStructure.USART_St

{

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate= 115200; //配置波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b; //配置数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位

USART_InitStructure.USART_Parity= USART_Parity_No ; //奇偶校验位

USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; //硬件流

USART_InitStructure.USART_Mode =USART_Mode_Rx |USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE); }

/*这段很重要,如果要使用printf函数打印信息,需要加fputc函数,就需要对printf函数重定向到串口,以前工作中他们老是提重定向,什么串口重定向,USB重定向什么的,我也是云里雾里,如今给我的感觉就是将上层函数实现对底层硬件的操作*/ int fputc(int ch, FILE*f){

while(USART_GetFlagStatus(USART1, USART_FLAG_TC) !=SET); /*网上的一些函数里面是没有这一句代码,如果不加的话,打印时第一个字符就会没有,原因据说是硬件复位后,USART_FLAG_TC被置一了,而要发送数据必须让其为底才可以,一表示数据发送发出的标志,也可以用这样一句USART_ClearFlag(USART2,USART_FLAG_TC);清楚标志位。可是我没这样做一样发成功了,这个疑惑以后再想明白。*/

USART_SendData(USART1, (uint16_t)ch);

while(USART_GetFlagStatus(USART1, USART_FLAG_TC) !=SET); return ch;

}

void usart_debug_config(void) //提供给main函数调用的串口配置函数 {

GPIO_Configuration(); //IO口配置 USART1_config(); //串口配置 }

还就是usart_debug.h

#ifndef __usart_debug_H #define __usart_debug_H

#include \#include

void usart_debug_config(void); int fputc(int ch, FILE *f);

#endif /* __USART1_H */

main函数:

这里使用两种方式一种是 使用普通的方式发送,另一种使用printf函数

其实还有一种USART_printf函数来实现,这里不做介绍。有空看看区别一下printf和usart_printf,据说是支持格式多少的问题

#include\

#include\包含main函数里的调用函数 int main(void) { unsigned char TxBuf1[100] ={\发送字符串!!!\\r\\n\ int i; SystemInit(); usart_debug_config();

for( i = 0; TxBuf1[i] != '\\0'; i++) { while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//这里跟分析fputc时是一样的 USART_SendData(USART1 , TxBuf1[i]);//发送字符数组里的单个字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); } printf(\ 世界你好! \\r\\n\调用printf函数 while(1) { ; } }

4、仿真及调试

程序编好之后,在target option里要选择 USE microLIB (keil自带的微库),这是使用非标准C库,在编译链接是,将我们编写的fputc函数作为编译的首选,否则就会编译stdio.h里的fputc函数。

写到这里我发现我这个代码感觉不是很好,使用微库而不用标准C库,应该会有影响,我瞬间就明白了他们为什么要自己编写支持输出格式很少的的USART_printf函数了,后面目测我也会使用这个函数。

一个好的程序代码就是结构健全,BUG很少。把简单做到极致

下载后通过secureCRT或者串口小助手观察

在KEIL里继续软件仿真

仿真和下载时要注意的是,仿真要选USE Simulation 而下载要选右边的JTAG。。。。

然后点击debug 进入调试界面

view--->serial windos -->UART 1 全速运行 其结果如下:

串口发送数据就到此为止。

5、串口接收数据

这儿写的跟上面的已经没有关系了,不要搞混。 关于从PC机发送数据到STM32,这一部分则需要中断来实现,因为我们不需要时时刻刻都来检测外部是否发出数据给STM32,因此只要有数据来,就触发中断。这里就需要配置NVIC了

void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //优先组为2 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //打开USART中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断通道使能 NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口接收中断使能 USART_Cmd(USART1, ENABLE); }

其他配置比如串口复用到IO配置,串口时钟配置,和发送数据是一样的。

串口中断处理函数:

void USART1_IRQHandler(void)

{ int RX_status; //自己定义一个标志位

…… 此处隐藏:1057字,全部文档内容请下载后查看。喜欢就下载吧 ……
STM32f103C8T6入门学习记录(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/447809.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)