历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2020年03月03日 | 【菜鸟入门】stm32 之 USART

2020-03-03 来源:eefocus

这是学习stm32的第四天了,怎么说呢?感触最大的是,细心最重要,为什么呢?昨天,一个二进制到十六进制换算出来问题,导致一个问题纠结了一下午,今天,在初始化时钟的时候,把9写成10,导致,串口到下午才调试好。


好吧,现在开始说串口。


在我的板子上,USART1对应的PIN是


PA10 --- RX INPUT   Mode:0x8

PA9 ---TX OUTPUT  Mode:0xb


其实串口初始化也就分下面几步:


(1)PIN管脚时钟使能,特殊功能寄存器使能,即GPIOA和USART1时钟使能;


(2)USART管脚配置,PA10配置成输入模式:0x8;PA9配置成输出模式;【前面讲过怎么配置】


(3)USART Reset;记得关闭Reset;


(4)USART 波特率设置;


(5)USART寄存器配置;


(6)USART中断配置;


还是老规矩,先附上代码:


/* USART0

PA10 --- RX INPUT  M:0x8

PA9 --- TX OUTPUT M:0xb

*/

#define CPU_RATE_72M 72

 

int rs232_init(u32 cpu_rate,u32 baud)

{

float div;

u16 div_int = 0;

u16 div_float = 0;

/* Get Div Baud */

div = (float)(cpu_rate*1000000)/(16*baud);

div_int = div;

div_float = 16*(div - div_int);

div_int <<= 4;

div_int += div_float;

RCC->APB2ENR |= 1<<2;

RCC->APB2ENR |= 1<<14;

GPIOA->CRH &= ~(0xff<<4); //clear CRH at bit 10:9

GPIOA->CRH |= 0x8b << 4; //set CRH at bit 10:9

RCC->APB2RSTR |= 1<<14; //Reset USART0

RCC->APB2RSTR &= ~(1<<14);//Stop Reset USART0

/* config USART */

USART1->BRR = div_int; // Set Baud Rate

 

USART1->CR1 &= ~(1<<12); // Set Data bit :8bit

USART1->CR1 &= ~(1<<10); // CRC

USART1->CR1 |= 1<<8; // Enable PE Interrupt

USART1->CR1 |= 1<<5; // Enable RX Interrupt

USART1->CR1 |= 3<<2; //Enable RX TX

USART1->CR2 &= ~(3<<12); // Stop Bit :00 => 1SB

USART1->CR1 |= 1<<13; // Enable USART

init_interrupt(2,37,3,3);

return 0;

}


APB2ENR寄存器如下,我们要使能IOPA和USART1的时钟所以,APB2ENR |= (1<<2) | (1<<14)

APB2RSTR是外设复位寄存器:我们最好把USART1重新复位下,来确保系统的稳定性:

但是,在复位完成之后,一定要对该控制位置零,停止复位;


APB2RSTR |= 1<<14;


APB2RSTR&=~(1<<14);


USART波特率的设置是整个配置中比较关键的,stm32厂商已经给了我们一个公式:

USARTDIV计算出来,然后需要换算成USART_BRR寄存器需要的模式:我们呢可以先来研究下BRR寄存器:

他是把整数部分存放在4-15bit,小数部分存放在0~3bit


至于小数和整数部分的换算方法,STM也给提供了一个例子:

波特率计算完了,我们就需要对USART的控制寄存器进行设置,USART有三个控制器CR1,CR2,CR3


其中常用的只有CR1,CR2中只需配置一个参数。


关于这两个寄存器的详细信息请看25.6.4~26.6.7章,不过基本上看我的注释就可以看懂;


USART的中断配置,跟昨天那个按键中断配置一样,他的中断向量号是37


今天我重新把中断配置函数进行了整理,大家可以拿去用:


void init_interrupt(u8 group,u8 inter_id,u8 preempting,u8 subpriority)

{

u32 aircr;

u8  ip;

/* Set Group :2 */

aircr = SCB->AIRCR; //Get AIRCR register

aircr &= 0x0000f8ff; //Clear Password & PriGroup

aircr |= 0x05fa0000; //Set Password

aircr |= ((~group&0x7)<<8); //Set PriGroup Group:2 0000 0010 => 1111 1101 [5 = 0101b]<<8

SCB->AIRCR = aircr; //Set AIRCR

/* 

* Group 2  2:2

* 0~3 : 0~3

* Set Preempting = 0  Subpriority = 0

* 1001 0000b = 0x00;

*/

if(inter_id<32)

NVIC->ISER[0] = 1<< inter_id;

else

NVIC->ISER[1] = 1<<(inter_id-32); //EXIT15_10 vector:37

switch(group)

{

case 0: ip = 0x0f&subpriority;break;

case 1: ip = (0x08&preempting) | (0x07&subpriority);break;

case 2: ip = (0x0C&preempting) | (0x03&subpriority);break;

case 3: ip = (0x0e&preempting) | (0x01&subpriority);break;

case 4: ip = 0x0f&preempting;break;

default: ip = 0x00;break;

}

NVIC->IP[inter_id] = 0xf0&(ip<<4);

}




他的发送和中断接收函数也都很简单,其中发送和接受标志位,在对数据进行写,或者读的时候他会自动清除

int rs232_send_byte(u8 byte)

{

USART1->DR = byte;

while(0 == (USART1->SR&(1<<6)));

return 1;

}

 

void USART1_IRQHandler(void)

{

if(USART1->SR&(1<<5))

{

rs232_send_byte(USART1->DR);

}

}


有了串口,我们以后调试程序就更方便,我们可以直接把寄存器值读出来,然后对初始化的寄存器值进行研究。

推荐阅读

史海拾趣

Hifn Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们不仅限于接收和转换电视信号,还具备丰富的网络交互功能。

机顶盒的核心功能在于接收并解码来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,将其转换成适合在电视机上播放的格式。这一过程包括接收、解码和显示三个主要步骤,确保了用户能够享受到高清乃至4K的超高清画质和震撼音效。此外,机顶盒还提供了诸如电子节目指南、因特网网页浏览等增值服务,极大地丰富了用户的观看体验。

随着技术的不断进步,机顶盒正朝着智能化、多功能化方向发展。例如,智能推荐算法能够根据用户的观看历史和偏好,提供个性化的节目推荐;语音识别技术则让用户能够通过语音指令控制机顶盒,实现更加便捷的操作体验。同时,机顶盒还支持家庭影院功能,让用户在家中就能享受到电影院般的视听效果。

总的来说,机顶盒作为连接电视与外部信号源的桥梁,不仅提升了电视节目的观看体验,还通过丰富的网络交互功能为用户提供了更加广泛的内容和娱乐选择。随着技术的不断发展和用户需求的日益多样化,机顶盒将继续在家庭娱乐领域发挥重要作用。

FEMA Electronics Corporation公司的发展小趣事

FEMA始终将产品质量视为企业的生命线。为了确保产品质量的稳定可靠,公司建立了一套完善的质量管理体系,并引进了先进的生产设备和技术。同时,FEMA还注重员工的培训和素质提升,确保每一个生产环节都能达到最高的质量标准。正是凭借这种对品质的执着追求,FEMA的产品在市场上赢得了良好的口碑和声誉,逐渐成为了行业内的知名品牌。

Hirel Systems Ltd公司的发展小趣事

FEMA在追求经济效益的同时,也积极履行社会责任。公司积极参与公益事业和慈善活动,为社会做出了积极贡献。同时,FEMA还注重环保和可持续发展,努力降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。在履行社会责任的过程中,FEMA实现了经济效益和社会效益的双赢。

Gould Fiber Optics公司的发展小趣事
可能是电源插头未插好、保险丝熔断、输入电压异常或电源内部元件损坏。
Antelec公司的发展小趣事

Antelec公司创立于XXXX年,由一群富有远见和热情的电子工程师组成。创立初期,公司专注于研发先进的电子测量与分析技术,成功开发出一种具有高精度和稳定性的测量仪器,填补了市场上的空白。这一技术突破不仅赢得了客户的青睐,也为公司的后续发展奠定了坚实的基础。

Colibrys SA公司的发展小趣事

近年来,Colibrys与Sensonor展开了紧密的协同合作,共同生产MEMS惯性传感器产品。两家公司在专业知识、市场地位、客户和技术方面的互补性,使得这种合作成为了一种双赢的选择。通过合力发展,Colibrys和Sensonor已经向航空、航天、国防、运输、移动和工业领域交付了超过2000万颗MEMS传感器,进一步扩大了公司的市场份额和影响力。

这些故事只是Colibrys SA公司在电子行业中发展起来的一部分事实,它们展示了公司从初创到成为行业领导者的艰辛历程和辉煌成就。然而,公司的发展还在继续,未来还将有更多的故事等待我们去书写和见证。

问答坊 | AI 解惑

请问各位大侠LM7805在哪个库中啊

请问各位大侠LM7805在哪个库中啊   在下谢谢了…

查看全部问答>

国内芯片厂商近况,部分找到蓝海?

看到一篇新闻,与大家分享下: 本土芯片商细分市场 部分找到蓝海 https://www.eeworld.com.cn/manufacture/2010/0125/article_2403.html 安凯营业收入已经超过2亿元,芯片出货量超过千万片,包括好记星、万虹、诺亚舟等国内教育电子产品前几大 ...…

查看全部问答>

关于smp8634芯片问题

现在手上有一块smp8634芯片的板子。可是播放高清视频及图片。 请问。有没有高手知道,smp8634 是否可以播放falsh文件。最好是可兼容falsh各个版本的。…

查看全部问答>

2410的触摸屏驱动问题求助

ret = request_irq(IRQ_ADC, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc); 申请了adc中断,但是无论如何无法进入中断处理程序s3c2410_isr_adc() 我在s3c2410_isr_adc()第一行做了一个printk语句. 请教大概是什么原因?…

查看全部问答>

求~ GPRS 的AT指令~

刚用西门子的 C60加上 移动的飞信 做了个随机聊天 的东西.... 不过貌似不好玩.. 后来发现这手机貌似还能当GPRS模块用~ at+cgdcont=1,\"ip\",\"cmnet\" OK at+cgdcont? +CGDCONT: 1,\"IP\",\"cmnet\",\"\",0,0 OK 不知道这两条指令具体 ...…

查看全部问答>

WinCE不支持cab文件,需要安装什么组件?

系统不是我们烧录的,是别的公司提供的,请问需要安装什么?…

查看全部问答>

诚心申请使用89美金FPGA开发板试用

自己也一直想购买一个开发板,但是对我一个普通的学生而言主要是因为经济上的承受能力,使自己短时间内无法拥有自己的开发板, 而且自己从大二开始就已经在学习VerilogHDL方面的知识和一些关于硬件的东西。对于一系列的软件也都比较熟悉,唯一的不 ...…

查看全部问答>

串口通信方式0中,RXD引脚电平

大侠们,,                   在串口工作方式0中,RXD 作为数据串行发送的引脚,TXD作为同步时钟移位脉冲引脚。           ...…

查看全部问答>

怎么让一个结构体首地址8字节对齐?

一份有关一个结构体首地址8字节对齐对话…

查看全部问答>

本人DIY隐形UFO公开一下

历经5年潜心研究,终于DIY隐形UFO,特在此开源一下:如下…

查看全部问答>