微处理器课程设计_课程设计cpu
微处理器课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“课程设计cpu”。
微处理器系统结构 与嵌入式系统设计 课程设计报告
题目: 基于ARM CORTEX M3的串行数据处理编程
课程: 微处理器系统结构
与嵌入式系统设计
学院: 机电学院
学生: 孙健(2011084040015)指导教师: 卢有亮
2013/12/07 1.题目要求及分析
1:说明:
1.工程描述:串口1接收到的1组严格按以下格式的数据,7个字节,格式为: FA LED1 LED2 LED3 LED4 校验和 FE 其中LED1到LED4的取值为0或1 若LEDN为1,将灯N点亮,否则灯N熄灭
2:要求:
1).在串口中断服务程序void USART1_IRQHandler(void)中用C语言编写代码接收数据到缓冲区(若干个字节的数组)
2).不允许在中断服务程序中判断校验和是否正确,不允许在中断服务程序中点亮和熄灭灯,校验和点亮和熄灭灯的操作应该在主程序中执行。
3).要求每接收到一组数据都能进行处理,当未接收完一组数据的时候不应去对数据进行处理 4).要求对硬件的操作采用寄存器编程方式,不使用库函数
3:分析:
1).由题目要求可知,本设计是通过串口进行通讯,而且传输方式为异步传输。在正确发送完7字节数据以后四个LED会根据收到的具体数据改变亮灭状况。
2).2.资料查找和学习过程
参考资料: STM32中文参考手册 高密度STM32 其他资料和示例代码等
1.芯片简介与选材
STM32 系列芯片是ST(意法半导体)公司近年来推出的一款基于Cortex-M3 核心的ARM 芯片,以其高性能、易上手和低价位的特点迅速得到推广。器件的选型为高密度的STM32F103VET6,目的是能适合一般项目的需要,而价格也控制在30元以下,又避免由于FLASH和RAM太小造成的瓶颈。因为要跑μC/OS和μC/GUI,需要一定的FLASH和SRAM的。
2.串口
1)的基本概念
在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。
USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。
RX: 接受数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。TX: 发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。
2)串口的如何工作的一般有两种方式:查询和中断。
(1)查询:串口程序不断地循环查询,看看当前有没有数据要它传送。如果有,就帮助传送(可以从PC到STM32板子,也可以从STM32板子到PC)。
(2)中断:平时串口只要打开中断即可。如果发现有一个中断来,则意味着要它帮助传输数据——它就马上进行数据的传送。同样,可以从 PC到STM3板子,也可以从STM32板子到PC。
3)芯片STM32F103的串口配置
实验中使用的芯片STM32F103VET6,内置3 个通用同步/异步收发器(USART1、USART2 和USART3),完全支持RS232 协议,且有更高的传输速率。接口电平匹配芯片选择高速且兼容3.3V 单片机的MAX3232(其外围电路与MAX232 同)。下面将对库函数的使用方法、I/O 端口和串行口的配置分别进行说明。
ST 公司给出了整个芯片外设的固件库,只需简单配置即可使用。首先把固件库中LibrariesCMSIS
CoreCM3 里面的6 个文件加入到工程中去,里面有启动文件、寄存器和变量定义文件,是使用库编程必不可少的文件; 然后在工程中加入实验中用的stm32f10x_rcc.c/stm32f10x_gpio.c 和stm32f10x_usart.c3 个文件分别用来配置时钟、端口和串口。完成后的文件列表如图中虚线框内所示。
重点讲述STM32 串口配置的方法。首先STM32要初始化时钟和外设,然后才能在主函数编程实现具体功能。
3.代码和分析
程序代码:
汇编部分:
AREA |DATA|,CODE,READONLY ENTRY;ldr r13,=0x1000 IMPORT main b main END C部分:
#include #include #include #include #include #include #include #include
//所有STM32外设驱动 #include “stm32f10x_lib.h”
typedef
unsigned char INT8U;typedef
char INT8S;typedef
unsigned int
INT16U;typedef
int
INT16S;typedef
unsigned long INT32U;typedef
long INT32S;
#define led_gpio GPIOC//((GPIO_TypeDef *)GPIOC_BASE)//*LED*// #define led1 GPIO_Pin_6 //led1 连接在GIIOC_6 #define led2 GPIO_Pin_7 //led2 连接在GIIOC_7 #define led3 GPIO_Pin_8 //led3 连接在GIIOC_8 #define led4 GPIO_Pin_9 //led4 连接在GIIOC_9 #define led_on1 GPIO_SetBits(led_gpio,led1)#define led_on2 GPIO_SetBits(led_gpio,led2)#define led_on3 GPIO_SetBits(led_gpio,led3)#define led_on4 GPIO_SetBits(led_gpio,led4)#define led_off1 GPIO_ResetBits(led_gpio,led1)#define led_off2 GPIO_ResetBits(led_gpio,led2)#define led_off3 GPIO_ResetBits(led_gpio,led3)#define led_off4 GPIO_ResetBits(led_gpio,led4)
#define
USART_RECV()USART1->DR #define USART_RECV_WAIT(x){ while(!(UCSRA1->SR &(1DR;}
INT8U
RecvStr[6];//*串口接收到的指令: 0xFA(开始)+0x00/0x01(LED1)+0x00/0x01(LED2)+0x00/0x01(LED3)+ 0x00/0x01(LED4)+0x00~0x04(校验)+ 0xFE(结束))*// INT8U
DataN=0;
//串口接收数据的个数
void
USARTInit(void);void USART1_TRQHandler(void);void led_init(){ GPIO_InitTypeDef GPIO_InitStructure;//开启gpio c 时钟信号
//*RCC_APB2PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP|RCC_APB2Periph_GPIOC,ENABLE);*//
//设计全部4个 LED指示灯信号为输出
GPIO_InitStructure.GPIO_Pin = led1 | led2 | led3 | led4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(led_gpio, &GPIO_InitStructure);}
int main(void){ USARTInit();
while(1){
if(DataN >= 6)
{
//DataN>=6表示串口已经收到了整组数据 if((RecvStr[0] == 0xAA)&&(RecvStr[6] == 0xFE)&&(RecvStr[1]+RecvStr[2]+RecvStr[3]+RecvStr[4]==RecvStr[5]))//先检查
{
if(RecvStr[1]==0x01)//for(i = 0;i
led_on1;
else if(RecvStr[1]==0x00)
led_off1;
if(RecvStr[2]==0x01)
led_on2;
else if(RecvStr[2]==0x00)
led_off2;
if(RecvStr[3]==0x01)
led_on3;
else if(RecvStr[3]==0x00)
led_off3;
if(RecvStr[3]==0x01)
led_on3;
else if(RecvStr[3]==0x00)
led_off3;
if(RecvStr[4]==0x01)
led_on4;
}
else if(RecvStr[4]==0x00)
led_off4;
}
DataN = 0;
//处理完成, 可以再次接收数据
} } void USARTInit(void){ RCC->APB2ENR|=1
//使能PORTA口时钟
RCC->APB2ENR|=1
//使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1
//复位串口1 RCC->APB2RSTR&=~(1
//*波特率设置*// USART1->BRR=9600;// 波特率设置
USART1->CR1|=0X200C;//1位停止,无校验位.// USART_CR1|= 0x00002000;//将USART_CR1寄存器的UE置1来激活USART。编程USART_CR1的M位定义字长
// USART_CR2|= 0x00000000;//在USART_CR2中编写停止位的个数
// USART_BRR = 9600;
//利用波特率寄存器USART_BRR选择希望的波特率。
// USART_CR1|= 0x00000004;//设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。
}
void USART1_TRQHandler(void)//USART中断处理 {
//在这里面添加串口数据接收中断处理程序
INT8U temp;
//中间变量
temp = USART_RECV();//读取串口收到的数据
if(temp == 0xFA)
{
//如果收到祯头, 那就得重新记数据
DataN = 0;
}
else if(DataN
{
//否则当DataN小于4,继续收数据
DataN++;
}
RecvStr[DataN] = temp;//将当前数据存到串口指令数组里 }
4.代码流程图
添加库函数 对GPIO端口的宏定义
状态寄存器初始化
开启时钟信号 使能串口时钟
选择合适波特率
定义中断处理
设置LED输出信号
开始接收数据
判断数据的完整与准确性
完整则编码LED灯表示
不完整恢复中断继续接收
5.心得体会
通过本次设计理解和掌握ARM的串行口工作原理。学习了UART的基本知识和基于stm32编程配置、实现UART通讯,学会了串口调试助手或超级终端的使用。
对微处理器的构成和stm32的具体功能有了更深的了解和认识。并且熟悉了c程序的编写以及汇编语言和c语言混合编程的实现,对以后嵌入式的学习起到了启发和推动作用。
在设计过程中也意识到了自己在许多方面的不足,比如基础知识的不牢固,工具软件使用等方面的问题,但在同学的帮助之下还是基本完成了任务。自己以后会以此为戒,多动手实践,将理论知识与具体操作结合,加深理解,才能更好的学习嵌入式系统。