历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2019年04月02日 | STM32F207调试记录之串口配置

2019-04-02 来源:eefocus

这几天在配置串口时出现了一些令人不解的问题,鬼魅般的不行啊!真是令人头疼!因为再一次遇到了这个问题,故想有必要做一个记录。


先说一下配置USART1的过程吧。

①配置串口1时钟,在APB2上

②复用功能连上IO引脚

③ 配置GPIO为复用模式、推挽、50MHz、上拉

④配置串口波特率为指定波特率、 8位数据长度、1位停止位、无校验、无流控制、串口模式为接收和发送

⑤使能串口

⑥配置串口中断包括 中断通道、抢占优先级、响应优先级、通道使能

⑦配置串口接收中断使能、发送中断使能 


至此串口配置完毕。

在主函数中放上串口发送函数(一秒发一次),开始调试,现象如下:

首先将断点放在发送中断和接收中断处理的地方,每隔一秒会进入发送中断中,但是最前两次状态寄存器中的值是正常的,之后会出现其他异常状态,此时将发送中断处理处的断点去除,程序会每隔一秒进入接收中断,因为本人并没有发送数据给这串口,但确实进入的接收中断,故才有了开头时的不解。


由于先前也出现过这样的情况,上一次是在串口5上而这一次在串口1上,上一次花了好几个晚上加班检查到底是那个地方出了问题。


从老项目上的代码进行对比发现似乎都是一样的,百度各种寻找解决办法,并没有发现有哪不对。最后实在没办法,把官方demo例程拿出来研究了,看了一遍又一遍,然后按照例程重新写了一遍。哈,没问题了。


贴出代码:


/*!

 * @brief   串口1 IO初始化

 * @param

 * @return NONE

 * @note PA9-TXD,PA10-RXD

 */

void USART_COM1IOInit(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); //!<串口1时钟初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //!<串口1时钟初始化

  

GPIO_PinAFConfig(GPIOA, 9, GPIO_AF_USART1); //!

GPIO_PinAFConfig(GPIOA, 10, GPIO_AF_USART1); //!

 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //!<接收和发送均设为复用模式

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //!<无上拉也无下拉

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

}

 

/*!

 * @brief   串口1 中断初始化

 * @param

 * @return NONE

 * @note

 */

void USART1InterruptInit(uint32 pri)

{

  NVIC_InitTypeDef NVIC_InitStructure;

 

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =pri;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  

  USART_ITConfig(USART1, USART_IT_TC, ENABLE);//!<使能USART1发送中断

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//!<使能USART1接收中断

}

 

/*!

 * @brief   将UART1初始化到指定的波特率上

 * @param baud_value:波特率 pri:优先级

 * @return NONE

 * @note PC串口

 */

void USART1_Init(uint32 baud_value,uint32 pri)

{

USART_InitTypeDef USART_InitStructure;

 

USART_COM1IOInit();  

USART_InitStructure.USART_BaudRate = baud_value;

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); //!<串口1初始化

USART_Cmd(USART1, ENABLE); //!<使能串口1

USART1InterruptInit(pri); //!<串口1中断配置

}

以上为本人修改过后可用初始化代码。

    经过仔细对比调试过后,最终把问题锁定在了那个IO口上拉下拉的配置上。本来配置为上拉串口异常,改为无上拉也无下拉之后程序正常了。按照常理来说,既然已经配置成复用推挽了,拉上或下拉就无所谓了,看来这个地方又是芯片给留出了一个坑,恰巧让俺跳进去了两次。程序正常之后,将那个配置重新改为上拉,程序还是正常。这个坑隐藏得好深!

    都进去过两次了,想仔细了解清楚,便去请教了大神同事,来解惑啦。

    之前没有重视这个问题,我本来以为会跟外围电路设计有关。同事否定了我的观点,正常设计的外围电路对芯片的影响基本没有。这个现象估计与芯片内部设计有关,由于官方例程中使用的配置为无上拉也无下拉,故推荐保持该配置。


推荐阅读

史海拾趣

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

金宇半导体成立于2005年,由一群来自国内外顶尖高校的半导体专家共同创立。在成立初期,公司面临着资金短缺和技术瓶颈的双重挑战。创始人团队凭借在微处理器设计领域的深厚积累,成功研发出了一款低功耗、高性能的嵌入式处理器芯片,迅速获得了市场的关注。这款芯片不仅在国内智能手机市场占据了一席之地,还成功打入国际市场,为公司的后续发展奠定了坚实基础。

Cedrat Technologies公司的发展小趣事

随着技术的不断进步和产品质量的提升,Cedrat Technologies开始积极拓展国际市场。公司凭借其卓越的技术实力和优质的产品服务,成功打入欧美等发达国家市场,赢得了众多客户的青睐。同时,公司也积极参与国际电子行业的交流与合作,提升了品牌知名度和国际影响力。

这些故事只是Cedrat Technologies在电子行业发展中的一小部分缩影,它们展示了公司在技术创新、产品应用和市场拓展等方面的努力和成果。未来,随着电子行业的不断发展和变革,相信Cedrat Technologies将继续保持其领先地位,为行业的发展贡献更多的力量。

三环(CCTC)公司的发展小趣事

进入21世纪后,三环(CCTC)公司迎来了快速发展的机遇期。公司根据市场需求和技术发展趋势,积极调整产品结构,形成了多元化布局。在这一阶段,公司先后发布了SOFC、PKG、GTM、氧化铝陶瓷基片以及TO部件等产品,并成功打入国内外市场。同时,公司加强了与国际知名企业的合作,提升了品牌影响力和市场竞争力。

Aptiv公司的发展小趣事

Aptiv一直秉持开放合作的理念,积极与产业链上下游企业开展创新合作。公司与多家科技公司、研究机构以及高校建立了战略合作关系,共同推动自动驾驶技术的研发和应用。通过共享资源、优势互补,Aptiv不仅加快了自身的发展步伐,还为整个电子行业的进步做出了积极贡献。

Hirel Systems Ltd公司的发展小趣事

作为一家具有社会责任感的企业,Aptiv始终关注社会公益事业。公司积极参与各项社会活动和慈善捐赠,为改善社会环境和提升公众生活质量做出了积极贡献。同时,Aptiv还注重在运营所在城市推动社区发展,通过创造就业岗位、支持教育事业等方式,为当地社会经济的繁荣做出了贡献。

Digital Core Design公司的发展小趣事

随着《古墓丽影》系列游戏的成功,Core Design的团队迅速扩张。当PS2主机即将推出时,索尼和Core Design都对这款新主机充满期待。为了抓住这一机遇,Core Design将“古墓丽影”的制作团队从最初的12人增加到60人,随后又增加到了100人。这一举措展示了Core Design对市场和技术的敏锐洞察力和决心。

问答坊 | AI 解惑

模电应知应会20问

1、半导体材料制作电子器件与传统的真空电子器件相比有什么特点?答:频率特性好、体积小、功耗小,便于电路的集成化产品的袖珍化,此外在坚固抗震可靠等方面也特别突出;但是在失真度和稳定性等方面不及真空器件。 2、什么是本征半导体和杂质半导 ...…

查看全部问答>

D类放大器电路板布局指南

如果没有遵循一些基本的布局指南,PCB设计将会限制D类放大器的性能或降低其可靠性。下面描述了D类放大器一些好的PC板布局实践经验。采用带有两个BTL输出的STA517B(每通道175瓦)数字功率放大器作为范例,但对所有的D类放大器而言,其基本概念是一致 ...…

查看全部问答>

红外半球摄像机让人欢喜让人忧

现在大陆市场中,由于监控发展较晚!红外半球摄像机红外灯被大陆的经销商和工程商吵的是如何如何的好,像什么白天一样!晚上没有任何光源,都能很清晰的分晰这个人是谁,这些话虽然让产品卖出去了,可是搞伤了我们技术人员和工程人员,验收那个难啊 ...…

查看全部问答>

基于AD9854的信号发生器的设计

基于AD9854的信号发生器的设计…

查看全部问答>

《51单片机C语言快速上手》

《51单片机C语言快速上手》如果大家觉得好就顶一下吧!…

查看全部问答>

求梅兰日兰UPS中文使用说明书操作手册

求梅兰日兰UPS中文使用说明书 请问哪位师傅手里有梅兰日兰UPS中文使用说明书啊,帮忙给传一下,或者给个网址也行啊,UPS是4.2KW、6KVA,我先谢谢啦!…

查看全部问答>

有人改写过nboot吗?

nand flash里bootloader的结构如下: 0:nboot 1:tocblock1 file 2:eboot 有人这样安装吗? 有人改写过nboot吗? 我的板子是2410的,我从网上找到了2410 BSP里面关于nboot的代码 读了下nboot里面的代码,硬件主要是初始化串口,感觉这些是通用的, ...…

查看全部问答>

WINCE 5.0 WZCEnumInterfaces 无法取得GUID,只取道名字

    使用这个名字,调用WZCQueryInterface无法获得WEP Key的信息。    在Windows XP SP2中,使用同样的方法,没有问题。…

查看全部问答>

2440开发版不支持大容量SD卡 请教怎么修改

看了GOOOGLEMAN的文章 http://www.cnblogs.com/wogoyixikexie/archive/2009/05/06/1450503.html 在platform->setting->environment 中设置IMGSDBUS2 = 1 在common.bib中也修改过 根本内容我也修改了BSP.C:\\WINCE500\\PLATFORM\\smdk2440\\DRIV ...…

查看全部问答>

谁能救命--关于Mplayer中Demuxer处理流程

哪为江湖大虾有研究过播放器Mplayer的原代码啊,特别是它Demux是如何处理的,最好能讲讲Mplayer的主处理函数,和详细的Demux过程?小弟不胜感激!…

查看全部问答>