STM32f103C8T6入门学习记录(5)
{
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字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




