微处理器课程设计

  • 格式:doc
  • 大小:421.50 KB
  • 文档页数:8

微处理器系统结构与嵌入式系统设计课程设计报告题目:基于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 公司给出了整个芯片外设的固件库,只需简单配置即可使用。

首先把固件库中Libraries\CMSIS\Core\CM3 里面的6 个文件加入到工程中去,里面有启动文件、寄存器和变量定义文件,是使用库编程必不可少的文件;然后在工程中加入实验中用的stm32f10x_rcc.c/stm32f10x_gpio.c 和stm32f10x_usart.c3 个文件分别用来配置时钟、端口和串口。

完成后的文件列表如图中虚线框内所示。

重点讲述STM32 串口配置的方法。

首先STM32要初始化时钟和外设,然后才能在主函数编程实现具体功能。

3.代码和分析程序代码:汇编部分:AREA |DATA|,CODE,READONL YENTRY;ldr r13,=0x1000IMPORT mainb mainENDC部分:#include <stdio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <stdarg.h>#include <stm32f10x.h>#include <stm32f10x_it.h>#include <stm32f10x_conf.h> //所有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_W AIT(x) { while ( !(UCSRA1->SR & (1<<RXNE)) ); (x)=UCSRA1->DR; }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 <= 4; i++ ) { if((RecvStr[i]==0x01) led_oni }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<<2; //使能PORTA口时钟RCC->APB2ENR|=1<<14; //使能串口时钟GPIOA->CRH&=0XFFFFF00F;GPIOA->CRH|=0X000008B0; //IO状态设置RCC->APB2RSTR|=1<<14; //复位串口1RCC->APB2RSTR&=~(1<<14); //停止复位//*波特率设置*//USART1->BRR=9600; // 波特率设置USART1->CR1|=0X200C; //1位停止,无校验位.// USART_CR1|= 0x00002000;//将USART_CR1寄存器的UE置1来激活USART。