微处理器课程设计_课程设计cpu

2020-02-27 其他范文 下载本文

微处理器课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“课程设计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语言混合编程的实现,对以后嵌入式的学习起到了启发和推动作用。

在设计过程中也意识到了自己在许多方面的不足,比如基础知识的不牢固,工具软件使用等方面的问题,但在同学的帮助之下还是基本完成了任务。自己以后会以此为戒,多动手实践,将理论知识与具体操作结合,加深理解,才能更好的学习嵌入式系统。

《微处理器课程设计.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
微处理器课程设计
点击下载文档
相关专题 课程设计cpu 微处理器 课程设计 课程设计cpu 微处理器 课程设计
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文