ARMCORTEXM串行数据处理编程.docx
《ARMCORTEXM串行数据处理编程.docx》由会员分享,可在线阅读,更多相关《ARMCORTEXM串行数据处理编程.docx(10页珍藏版)》请在冰豆网上搜索。
![ARMCORTEXM串行数据处理编程.docx](https://file1.bdocx.com/fileroot1/2023-2/8/b7f49b32-78dc-4c2a-9f21-1b418b832fa1/b7f49b32-78dc-4c2a-9f21-1b418b832fa11.gif)
ARMCORTEXM串行数据处理编程
微机原理课程设计
题目:
基于ARMCORTEXM3的串行数据处理编程
1:
说明:
1.工程描述:
串口1接收到的1组严格按以下格式的数据,7个字节,格式为:
FALED1LED2LED3LED4校验和FE
其中LED1到LED4的取值为0或1
若LEDN为1,将灯N点亮,否则灯N熄灭
2:
要求:
1).在串口中断服务程序voidUSART1_IRQHandler(void)中用C语言编写代码接收数据到缓冲区(若干个字节的数组)
2)不允许在中断服务程序中判断校验和是否正确,不允许在中断服务程序中点亮和熄灭灯,校验和点亮和熄灭灯的操作应该在主程序中执行。
3).要求每接收到一组数据都能进行处理,当未接收完一组数据的时候不应去对数据进行处理
4)要求对硬件的操作采用寄存器编程方式,不使用库函数
3.课程设计报告要求:
1)包括主程序和中断服务程序的源代码,每行代码加注释
2)画出程序执行的流程分析图
3)格式要求如下:
1.课程设计题目分析
2.资料查找和学习过程
3.代码和分析
4.代码流程图
5.心得
2:
参考资料:
2.1原理图
2.1.1MCU及其周围电路设计
如图
8.低速晶振电路
1.唤醒电路
7.AD输入
2.复位电路
3.启动配置
4.高速晶振电路
5.AD参考
电路
6.后备电池
6.备用电源
5.参考电压
图2.1.1MCU及其周边电路
2.1.2USB转串口电路设计
USB转串口电路可以方便没有串口的笔记本电脑用户通过USB接口下载代码到FLASH中,及进行RS232串行通信。
图2.1.2USB转串口接口电路
USB转串口芯片是CP2102,该芯片稳定性较好。
当其正常工作的时候,灯LED6亮。
该芯片DP/D+引脚连MINIUSB接口的脚3,DM/D-引脚连MINIUSB接口的脚2,为一对USB输入输出线。
TXD与RXD引脚接MCU的PA10(USART1_RX)和PA9(USART1_TX)。
2.1.3按键、LED显示电路和其他接口
按键、LED和蜂鸣器是常规的设备,除了RESET和WAKEUP按键外,开发板上还提供了2个按键,具有4个高有效的指示灯和蜂鸣器,电路如下图
图2.1.3指示灯、按键、蜂鸣器电路
2.2相关资料
2.2.1STM32F103VET6(CORTEXM3内核的MCU)概况
表
项目
解读
内核
ARM32-bitCortex-M3CPU核
最高频率
72MHz
处理能力
1.25DMIPS/MHz平均每个时钟执行1.25条指令,这是比较高的处理能力。
FLASH
512K字节Flash存储器
SRAM
64K字节SRAM
电源和I/O输入范围
2.0到3.6V
模数转换器ADC
3个12位ADC,16通道
数模转换器DAC
2个12位DAC,2通道
GPIO
80个,可忍受5V的高压
调试
串口调试(SWD)和JTAG接口
定时器
8个,TM1-TM8
通信接口
13个,5个串口,2个I2C,3个SPI,1个CAN,1个USB,1个SDIO
FSMC
有
2.2.2CORTEXM3寄存器
3.3.1GPIO寄存器
GPIO寄存器包括:
两个32位的配置寄存器(GPIOx_CRL,GPIOx_CRH)、两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR)、一个32位的置位/复位寄存器(GPIOx_BSRR)、一个16位的复位寄存器(GPIOx_BRR)、一个32位的锁定寄存器(GPIOx_LCKR)。
以上所有寄存器不允许按位访问或字节访问,必须按32位字访问。
1.配置寄存器(GPIOx_CRL,GPIOx_CRH)(x=A..E)
STM32每个GPIO端口有两个32位配置寄存器,如GPIOC_CRL,GPIOC_CRH为端口C的配置寄存器。
STM32一个端口有16位,也就对应芯片的16个管脚。
CRL控制端口的低八位,CRH控制端口的高8位。
图3.3.1GPIO配置寄存器CRL
由图3.3.1,CRL寄存器共32位,4位1组,每组控制1个引脚的配置(输入输出模式)。
例如,假设这个计算器是GPIOC->CRL,位31-28共4位,那么这4位控制了GPIOC的7脚的输入输出模式。
假设要配置GPIO的IO口y,那么需要写CNFy[1:
0]和MODEy[1:
0]。
MODE[1:
0]配置输入输出模式,输出的速率:
00:
输入模式(复位后的状态)
01:
输出模式,最大速度10MHz
10:
输出模式,最大速度2MHz
11:
输出模式,最大速度50MHz
CNF[1:
0]取值及含义根据配置为输入和输出有不同:
输入模式下:
00:
模拟输入模式
01:
浮空输入模式(复位后的状态)
10:
上拉/下拉输入模式
11:
保留
输出模式下
00:
通用推挽输出模式
01:
通用开漏输出模式
10:
复用功能推挽输出模式
11:
复用功能开漏输出模式
CRH寄存器除了控制的是高8位端口外,其结构和含义都与CRL完全相同。
如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CR寄存器。
例如,要设置GIPOD的4位端口为最高50M频率的推挽输出,15位端口位上拉下拉输入模式,应该设置如下:
GPIOD->CRL的CNF4[1:
0]为00,GPIOD->CRL的MODE4[1:
0]为11。
GPIOD->CRH的CNF7[1:
0]为10,GPIOD->CRH的MODE7[1:
0]为00。
因此,编程如下:
GPIOD->CRL&=0XFFF0FFFF;//清掉对位4的配置
GPIOD->CRL|=0X00030000;//写位4的位置为0011
GPIOD->CRH&=0X0FFFFFFF;//清掉对位15的配置
GPIOD->CRH|=0X8000000;//写位15的配置为1000
为什么要写的这么麻烦呢,就是因为只能32位操作,不能进行位操作的原因!
如果是对整个PD口进行配置,才可以直接赋值。
2.端口输入数据寄存器(GPIOx_IDR)和端口输出数据寄存器(GPIOx_ODR)
GPIOx_IDR是只读,作输入数据寄存器,这个寄存器是32位的,并且只能是按16位进行编程操作。
图3.3.2数据输入寄存器IDR
DRy[31:
16]:
保留,读出始终是0.
DRy[15:
0]:
端口输入数据(y=0…15)
这些位为只读并只能以字(16位)的形式读出。
读出的值为对应I/O口的状态(0或1)。
GPIOx_ODR是可读可写的,作输入数据寄存器,这个寄存器是32位的,并且只能是按16位进行编程操作。
图3.3.3数据输出寄存器ODR
ODRy[31:
16]:
保留。
ODRy[15:
0]:
端口输出数据(y=0…15)
实验证实,要读取某端口输入的数据,要设置端口为输入模式,然后通过IDR寄出去读取才是正确的。
ODR反应了作为输出时,上一次写出的数据。
例如,刚刚设置GIPOD的4位端口为最高50M频率的推挽输出,现在将其置1,可以编程如下:
GPIOD->ODR|=1<<4;//等同于GPIOD->ODR|=0x10;
如果写成GPIOD->ODR=0x10有问题吗?
有的,而且问题相当严重,因为不小心将GPIOD的其他端口都清0了!
这可不是想要的结果。
如果使GIPOD的位4端口再输出低电平,编程应该如下:
GPIOD->ODR&=(~(1<<4));//等同于GPIOD->ODR&=0xEF()
如果使GIPOD的位4端口输出低电平,位5端口输出高电平,编程如下:
GPIOD->ODR&=(~(1<<4));
GPIOD->ODR|=1<<5;
有点尴尬了,需要两条语句!
而且条条语句都有回读操作!
这样的操作在需要高实时性的场合,就不太合适了,而且大家可以看到,同步性差,需要先将位4设置为低电平,然后将位5设置为高电平,这中间是有时间间隔的!
因此,为了更加方便而且有效率的编程,必须介绍下端口位设置/清除寄存器BSRR和端口位清除寄存器BRR设置。
3.端口位设置/清除寄存器(GPIOx_BSRR)(x=A..E)
通过设置BSRR或BRR寄存器来设置某一特定引脚的输出电平,而保持其他引脚输出不变,速度快,效率高。
端口位设置/清除寄存器BSRR是专为方便编程设计的,该寄存器采用32位编程。
BSRR寄存器结构如图
图
BRy:
清除端口x的位y(y=0…15)(端口x复位位y)。
这些位只能写入并只能以字(16位)的形式操作。
如果BRy为0:
对对应的ODRy位不产生影响1:
如果BRy为1:
清除对应的ODRy位为0
BSy:
设置端口x的位y(y=0…15)(端口x设置位y)这些位只能写入并只能以字(16位)的形式操作。
如果BSy为0:
对对应的ODRy位不产生影响
如果BSy为1:
设置对应的ODRy位为1
需要注意的是:
如果同时设置了BSy和BRy的对应位,BSy位起作用。
例如,将GIPOD的4位端口输出低电平,5位端口输出高电平,编程如下:
GPIOD->BSRR=0x00100020;
于是,一条语句就解决了,用示波器观察就会看到两位同时被设置。
另外,如果想清除某位,而BSRR中的位清除在高16位,使用起来不是很方便,可以使用端口位清除寄存器BRR。
4.端口位清除寄存器(GPIOx_BRR)(x=A..E)
端口位清除寄存器BRR也是专为方便编程设计的,该寄存器采用16位编程。
它的结构如下:
图
高16位保留,设置BRR低16位的值位1,就可以清除(置0)该位。
例如,将GIPOD的4位端口输出低电平,编程如下:
GPIOD->BRR=1<<4;
这种操作避免了回读(&=或|=)效率高速度快!
2.2.4串口寄存器
这部分请自行参考STM32中文用户手册.
2.3资料下载
1.STM32开发板光盘
链接:
/link?
shareid=67&uk=10密码:
1xno
2.