基于STM32单片机的点阵显示设计一、系统的硬件设计1.1系统的硬件设计方案STM32F103x6是基于ARM核心的增强型32位带闪存、USB、ADC和CAN的微控制器。
在电机驱动和应用控制、医疗和手持设备、智能仪表、警报系统和视频对讲中有广泛的应用。
通过使用STM32F103x6进行LED点阵显示的设计,学习STM32单片机的使用方法。
1.2 STM32单片机简介根据本课题需要采用用了STM32F103x6型号单片机STM32F103XX增强型系列拥有ARM的Cortex-M3核心,它为实现MCU的需要提供了低成本、缩减的管脚数目、降低的系统内耗,同时提供了卓越的计算性能和先进的中断系统响应。
它的原理图如图1-2所示。
图1-2 STM32单片机原理图1.2.1 STM32F103x6单片机的功能■核心--ARM 32位的Cortex-M3CPU--单周期硬件乘法和除法,加快计算■存储器--从32K字节到128K字节闪存程序存储器--多重自举功能■时钟、复位和供电管理--2.0至3.6伏供电和I/O管脚--上电/断电复位、可编程电压检测器、掉电检测器--内嵌4至16MHZ高速晶体振荡器--内嵌PLL供应CPU时钟--内嵌使用32KHZ晶体的RTC振荡器■低功耗--3种省电模式:睡眠、停机和待机模式--VBAT为RTC和后备寄存器供电■2个12位模数转换器,1us转换时间--双采样和保持功能--温度传感器■调试模式--串行调试和JTAG接口■DMA--支持的外设:定时器、ADC、SPI、I2C和USART■多达80个快速I/O口--26/36/51/80个多功能双向5V兼容的I/O接口■多达7个定时器--多达3个同步的16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道--两个看门狗定时器--系统时间定位器:24位的带自动加载功能的■多达9个通信接口--多达2个I2C接口--多达3个USART接口--多达2个SPI同步串行接口--CAN接口--USB2.0接口1.2.2 STM32单片机的主要特色STM32系列32位闪存微控制器使用来自于ARM公司具有突破性的Cortex-M3内核,该内核是专门设计于满足集高性能、低功耗、实时应用、具有竞争性价格于一体的嵌入式领域的要求。
Cortex-M3在系统结构上的增强,让STM32受益无穷;Thumb-2®指令集带来了更高的指令效率和更强的性能;通过紧耦合的嵌套矢量中断控制器,对中断事件的响应比以往更迅速;所有这些又都融入了业界领先的功耗水准。
STM32系列给MCU用户带来了前所未有的自由空间,提供了全新的32位产品选项,结合了高性能、实时、低功耗、低电压等特性,同时保持了高集成度和易于开发的优势。
它拥有出众和创新的外设,易于开发,可使产品快速进入市场。
1.3 STM32单片机开发板简介本课题采用了普中科技的STM32开发板,配备有STM32F103x6芯片。
开发板的引脚图如图1-3所示。
图1-3 普中科技的STM32开发板实物图1.3.1 STM32开发板的外围硬件资源--8*8双色点阵模块--五线四相步进电机--四线双极性步进电机--动态数码管/静态数码管--74HC595--74HC165--USB自动下载--MCU--矩阵键盘、独立按键--AD/DA/光敏/温敏--ISP、PS2等等。
其电路图如图1-3-1。
图1-3-1 普中科技的STM32开发板内部电路图1.3.2 STM32开发板的软件资源STM32开发板提供了丰富的标准例程,其例程列表如下:编号实验名称编号实验名称编号实验名称1 LED灯10 74HC595 19 定时器TIM211 74HC165 20 串口通信2 RCC系统时钟3 独立按键12 EXIT中断21 DS18B20温度检测4 晶体数码管13 FLASH保存22 RTC时钟显示数据5 动态数码管14 STM32-24C0223 ADC1-DMA6 SysTick定时器15 STM32-ADDA-PCF859124 彩屏例程7 步进电机16 STM-1602 25 CAN-BUS8 矩阵键盘17 硬件I2C读取24C02 26 VirtualPort(USB转串口)9 LED点阵18 硬件SPI-5951.4 硬件电路本科创课题涉及的硬件电路如图1-4所示。
图1-4 STM32 LED点阵实验在开发板上的接线图二、系统的软件设计对于一个完整的嵌入式应用系统的开发,硬件的设计与调试工作仅占整个工作量的一半,应用系统的程序设计也是嵌入式系统设计一个非常重要的方面。
本次软件编写在Keil软件平台进行的。
如图2-1所示。
图2-1 Keil软件平台截图2.1对STM32端口进行配置对端口的配置程序如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //关闭调试端口重新映射使用仿真器调试时,不能用此语GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ; //所有GPIO为同一类型端口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZGPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOB端口2.2 控制LED点阵显示的主程序设计控制LED点阵显示的程序如下:while (1){m++ ;if(m> 4) m=1;switch (m){case 1:for(j=0;j<3;j++)////从左到右3次{for(i=0;i<8;i++){//P2=taba[i];GPIOB->BSRR = taba[i] & 0x00ff; //将数据送到P2口并屏蔽高位,不干扰高8位IO的使用GPIOB->BRR = (~taba[i]) & 0x00ff;// P1=0xff;GPIOA->BSRR = 0xff & 0x00ff; //将数据送到P1口并屏蔽高位,不干扰高8位IO的使用GPIOA->BRR = (~0xff) & 0x00ff;Delay(0X0DFFFF);}}break;case 2:Delay(800);for(j=0;j<3;j++)////从右到左3次{for(i=0;i<8;i++){//P2=taba[7-i];GPIOB->BSRR = taba[7-i] & 0x00ff; //将数据送到P2口并屏蔽高位,不干扰高8位IO的使用GPIOB->BRR = (~taba[7-i]) & 0x00ff;//P1=0xff;GPIOA->BSRR = 0xff & 0x00ff; //将数据送到P1口并屏蔽高位,不干扰高8位IO的使用GPIOA->BRR = (~0xff) & 0x00ff;Delay(0X0DFFFF);}}break;case 3:Delay(800);for(j=0;j<3;j++)////从上至下3次{for(i=0;i<8;i++){//P2=0x00;GPIOB->BSRR = 0x00 & 0x00ff; //将数据送到P2口并屏蔽高位,不干扰高8位IO的使用GPIOB->BRR = (~0x00) & 0x00ff;//P1=tabb[7-i];GPIOA->BSRR = tabb[7-i] & 0x00ff; //将数据送到P1口并屏蔽高位,不干扰高8位IO的使用GPIOA->BRR = (~tabb[7-i]) & 0x00ff;Delay(0X0DFFFF);}break;case 4:Delay(800);for(j=0;j<3;j++)////从下至上3 次{for(i=0;i<8;i++){//P2=0x00;GPIOB->BSRR = 0x00 & 0x00ff; //将数据送到P2口并屏蔽高位,不干扰高8位IO的使用GPIOB->BRR = (~0x00) & 0x00ff;//P1=tabb[i];GPIOA->BSRR = tabb[i] & 0x00ff; //将数据送到P1口并屏蔽高位,不干扰高8位IO的使用GPIOA->BRR = (~tabb[i]) & 0x00ff;Delay(0X0DFFFF);}}break;}}2.3 RCC函数的配置配置程序代码如下:void RCC_Configuration(void){//复位RCC外部设备寄存器到默认值RCC_DeInit();//打开外部高速晶振RCC_HSEConfig(RCC_HSE_ON);//等待外部高速时钟准备好HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好{//开启FLASH的预取功能FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//FLASH延迟2个周期FLASH_SetLatency(FLASH_Latency_2);//配置AHB(HCLK)时钟=SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);//配置APB2(PCLK2)钟=AHB时钟RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB1(PCLK1)钟=AHB 1/2时钟RCC_PCLK1Config(RCC_HCLK_Div2);//配置PLL时钟== 外部高速晶体时钟*9 PLLCLK = 8MHz * 9 = 72 MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//使能PLL时钟RCC_PLLCmd(ENABLE);//等待PLL时钟就绪while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}//配置系统时钟= PLL时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//检查PLL时钟是否作为系统时钟while(RCC_GetSYSCLKSource() != 0x08){}}}2.4 NIVC函数配置配置的程序如下:void NVIC_Configuration(void){#ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif设置向量表的位置和偏移量,如果向量表位于RAM,则偏移量为0x0。