1.前言
这个例程花了我好几天的时间,涉及到的内容比较多,走了很多弯路,一定要总结一下!
首先说明,我的开发板不是比较流行的正点原子家的,而是普中的STM32F1,原子家的开发板太贵了。到目前为止,我还没有发现我的开发板出现硬件上的问题,就是客服很不给力,关于仿真器配置的一个小问题就解决不了。好在网上资料比较丰富,慢慢也能解决自己遇到的一些问题。
思路和程序网上大家列举的都一样。在上网查资料的过程中发现,ARM开发板就是厉害,我想找什么问题,不管大家用什么型号的开发板,程序几乎一点都没有变化,问题讨论起来方便多了!
2.程序摘要
分为4部分:GPIO配置、USART参数配置、NVIC总中断配置、中断函数;
在主函数中初始化以上配置,直接进入while(1)就行了。
首先配置管脚GPIOA:GPIO_Init
//使用USART1的PA9和PA10,打开GPIOA:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//打开USART1时钟;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//通过结构体配置GPIOA的USART1接口PA9,输出为“复用推挽输出”:
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
//P10接口,输入为“模拟浮空输入”:
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
……
注意:这里使用了管脚复用功能,但是并不需要下面这句话:
“RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);”
原因:STM32F103:什么时候需要复用IO(AFIO)?
串口通信USART1参数配置:USART_Init
使用USART_Init函数,配置包括波特率、停止位、数据位、校验位等常见的串口通信的参数;
//记得同时打开“发送模式”和“接收模式”:
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
//打开串口USART1使能:
USART_Cmd(USART1, ENABLE);
//打开USART1的串口接收中断:
USART_ITConfig(USART1, USART_IT_RXNE ,ENABLE);
//清除中断标志位
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
这里要弄清楚,可以操作USART1中断标志位(也就是输入参数是USART的中断类型)的库函数有三个:
USART_ITConfig:使能/失能中断
USART_ GetITStatus:读取中断状态
USART_ClearITPendingBit:清除中断标志位
其中,清除中断标志位用: USART_ClearITPendingBit;
总中断设置:NVIC_Init
//记得配置中断参数之前,要进行中断分组;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//选择USART1中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
中断函数
这里要实现的功能是:
PC向单片机发送字节数据,单片机接收到数据后+2,并返回到PC端;
void USART1_IRQHandler ()
{
u8 k;
//判断现在发生的中断的类型,可以用USART_GetFlagStatus吗?
if(USART_GetITStatus(USART1,USART_IT_RXNE)== SET)
{
//读接收寄存器,系统自动清除接收中断标志位
k=USART_ReceiveData(USART1);
k=k+2;
//发送数据
USART_SendData(USART1,k);
//等发送完成;可以用USART_GetITStatus吗?
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
}
第一个问题:
进入中断之后,判断中断发生的类型时,可以使用USART_GetFlagStatus吗?
回答:
可以。把:if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
替换成: if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)),
结果证明可以。
事实上,USART_IT_RXNE 只是中断类型名,要接ENABLE/DISABLE的,不是中断标志位,我猜测 USART_GetITStatus 函数其实判断的也是发送完成的flag:USART_FLAG_TXE。
但是,明明已经进入了中断,查询中断状态来判断不是更加顺其自然吗!
第二个问题:
执行发送语句、等待发送完成的时候,可以用 USART_GetITStatus 函数判断是否发送完成吗?
回答:
不可以。因为发送中断根本没打开,中断状态也是无效的。
3.遇到的问题
软件问题
写好程序之后,通过仿真器调试发现,总是不能进入接收字节的串口中断;
当时有一种病急乱投医的感觉,在网上查了很多资料,有说“不该打开发送中断”的,有说“在中断函数中没有清楚中断标志位”的,也有说“管脚复用没有打开”的……
再说明一下:本次管脚复用不需要用那句话打开的,上面链接讲的很详细了。
等我调试好,把上面的说法进行逐个验证,最后不需要的都没加上,最终得到了上面所示的最简洁的,并且实现预期效果的通信程序。
硬件问题
其实,最开始导致程序不能进入中断的原因,是硬件的原因。
232串口通信,根据我的经验,找了一根USB转9针串口,连接上发现不进入中断……
后来各种调试没结果,实在没办法了,看视频才知道,这个开发板的232有两种模式,USART1使用的是:
PC→USB转microUSB数据线→CH340芯片→USART1接口→MCU
而常见的却是这种模式:
PC→USB转9针串口数据线→max232芯片→USART1串口→MCU
我误以为USART1是后者,调了很久没结果……
4.总结
这个例程已经花了好几天时间了……
今天上午实验室的师兄师姐们进行招聘网上答题,给出一个问题,在很短的时间内提出解决方法并编出程序。感觉这种考验真的能体现出水平,不妨偶尔把平时遇到的问题当做考试来解决,换一换思路和环境,毕竟也不是做研究,没必要按部就班像上课一样学习。
遇到一个问题就像面临一张空白的试卷,我按照流程不慌不忙的花个几天解决问题,就像把试卷当做练习题来做;
但是总做练习题,水平提高的并不是很快,不如偶尔认真起来,把这一张试卷当做考试,不是为了应试,而是为了在考试中发现自己的薄弱部分,毕竟考试完毕也可以好好总结。
从下一个例程开始!
上一篇:STM32的AFIO时钟什么时候需要开启
下一篇:开启和关闭AFIO时钟
推荐阅读
史海拾趣
近年来,随着全球能源结构的调整和光伏产业的快速发展,市场竞争日益激烈。ANYSOLAR也面临着来自同行的竞争压力和成本上升的挑战。为了应对这些变革和危机,ANYSOLAR积极调整战略,优化生产流程,降低成本。
同时,公司还加大了对新兴市场的开拓力度,通过参加国际展会、建立海外销售渠道等方式,拓展新的业务增长点。这些措施有效缓解了公司的经营压力,为公司的持续发展注入了新的活力。
面对不断变化的市场和客户需求,DMC始终坚持创新驱动的发展战略。通过加强研发投入、引进高端人才、加强产学研合作等方式,DMC不断推出具有创新性和竞争力的新产品。同时,DMC还密切关注行业发展趋势和市场需求变化,及时调整战略规划和产品定位。展望未来,DMC将继续秉承“创新、质量、服务”的理念,致力于成为全球电子行业的领军企业之一。
以上五个故事虽然是虚构的,但它们基于DMC在电子行业中的实际发展情况和可能面临的挑战进行了合理推测和演绎。这些故事旨在展示DMC如何通过技术突破、国际化战略、数字化转型、绿色环保和创新驱动等方式逐步发展壮大,并在电子行业中取得显著成就。
在电子行业中,品质控制和质量管理是企业生存和发展的关键。凯励公司深知这一点,建立了严格的质量管理体系和检测机制。公司从原材料采购到生产制造、产品检测等各个环节都严格把控品质,确保产品的稳定性和可靠性。此外,凯励公司还引进了先进的生产设备和检测仪器,提高了生产效率和产品质量。
在电子行业的初期,Capar Components Corp由几位热衷于电子技术的年轻人创立。他们凭借对技术的热情和对市场的敏锐洞察,决定投身于电子元器件的研发与生产。然而,创业的道路并非一帆风顺。资金短缺、技术瓶颈以及市场竞争激烈等问题接踵而至。但他们没有放弃,通过不断的技术创新和市场调研,成功研发出一款性能优异的电容器,迅速打开了市场,奠定了公司的基础。
CINCH公司深知人才是企业发展的核心竞争力。因此,公司高度重视人才培养和团队建设。公司设立了完善的培训体系,为员工提供了广阔的晋升空间和发展机会。同时,公司还积极引进优秀人才,打造了一支高素质、专业化的团队。这支团队在公司的各项业务发展中发挥了重要作用,为公司的长远发展奠定了坚实基础。
近年来,随着电子信息技术的快速发展和智能化趋势的加剧,东晶电子也面临着新的机遇和挑战。为了适应市场变化和满足客户需求,公司开始实施战略转型和升级。公司加大了对新型电子元器件的研发力度,推动产品向微型化、功能化、高精度方向发展。同时,公司还积极开拓新领域和新市场,拓展业务范围和市场份额。这些举措为公司未来的发展奠定了坚实的基础。
请注意,这些故事是基于已知信息的概括性描述,并非具体的历史事件。在实际情况中,东晶电子的发展历程可能更加复杂和多样化。
本人刚入行嵌入式开发,基础较薄弱,尤其是底层驱动硬件方面,现在主要做qt的开发,我对底层也敢兴趣,想买块开发板玩玩,是价格便宜的24xx呢,还是功能强大的6410啊。开发板纯粹用来学习用,请各位大牛指教~… 查看全部问答∨ |
|
EVC书上的例子,但是程序有些错,如果输入数字超过2个,程序自动关闭。或是输入字母有时出现同样情况。内存分配的函数如下,这些数据还没写入串口缓冲区呀,占用的内存应该也不多呀。是什么问题啊??? 获取用户输入:BYTE * buf; ...… 查看全部问答∨ |
|
无线技术分不同种类,通常以产生无线信号的方式来区分,目前主要的方式有调频无线技术、红外无线技术和蓝牙无线技术三种,其成本和特点也不尽相同。广泛应用于音响 键鼠等各项内容,有很好的发展前景。 无线技术定义:智能天线原名自适应天线阵列( ...… 查看全部问答∨ |
这是STM32f103操作AD芯片(AD7746)的写入波形图,会发现有毛刺 上面两张为细节图 下面给出的是为F2812对相同芯片操作波形图,就没有明显的毛刺 STM32F103为什么GPIO口会出现电平转换,毛刺产生的问题,这是外围电路搭接产生的问题还是芯片本 ...… 查看全部问答∨ |
求指点MSP430F149驱动超声波模块程序,不能正常工作 #include <msp430f149.h> #define RISE 1 #define FALL 0 #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)( ...… 查看全部问答∨ |
【朱兆祺带你学嵌入式】第二章第八节 U-Boot-2013.04启动分析(4) 1) 调用board_init_f函数 bl board_init_f实际上,board_init_f()函数是U-Boot执行的第一个C语言函数:void board_init_f(ulong bootflag),这个函数位于arch/arm/lib目录下的board. ...… 查看全部问答∨ |
蓝牙4.0之旅第二步 CC2540 USB DONGLE 布局完成喽 淘宝上卖的太贵了,准备自己做一个。 可以通过ANDROID上的USB连接滴蓝牙模块,让普通PAD装备BLE功能 顺便放几个PCB参考设计的资料,TI官方的,网站上就能下到。 [ 本帖最后由 littleshrimp 于 2013-12-15 20:08 编辑 ]… 查看全部问答∨ |
我在调试UCD3138交错PFC时出现如下问题:波形如下图所示,其中CH3是交流输入电流, CH4是其中一相驱动管DS波形,另外两个通道CH1和CH2没有用到。对外围电路进行了各种调试,DS波形和输入电流总会间歇性出现一段不稳定(或不正常的情况),请问这是 ...… 查看全部问答∨ |