ARMCORTEXM串行数据处理编程.docx

上传人:b****7 文档编号:10164631 上传时间:2023-02-09 格式:DOCX 页数:10 大小:355.07KB
下载 相关 举报
ARMCORTEXM串行数据处理编程.docx_第1页
第1页 / 共10页
ARMCORTEXM串行数据处理编程.docx_第2页
第2页 / 共10页
ARMCORTEXM串行数据处理编程.docx_第3页
第3页 / 共10页
ARMCORTEXM串行数据处理编程.docx_第4页
第4页 / 共10页
ARMCORTEXM串行数据处理编程.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

ARMCORTEXM串行数据处理编程.docx

《ARMCORTEXM串行数据处理编程.docx》由会员分享,可在线阅读,更多相关《ARMCORTEXM串行数据处理编程.docx(10页珍藏版)》请在冰豆网上搜索。

ARMCORTEXM串行数据处理编程.docx

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.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1