实验指导书4.2-2_第1页
实验指导书4.2-2_第2页
实验指导书4.2-2_第3页
实验指导书4.2-2_第4页
实验指导书4.2-2_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 二十八、三色RGB与三色LED模块实验1、模块介绍这两个模块都是通过R、G、B三个引脚的PWM电压输入来调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果,从而可以产生任意一种颜色。三色RGB模块由一个贴片全彩LED制成,三色LED模块由一个插件全彩LED制成。用STM32开发板通过程序对这两个模块进行控制可实现酷炫的灯光效果。产品特性:1、RGB三基色接限流电阻防止烧坏2、通过PWM调节三基色可混合得到不同的颜色3、可与各种单片机接口4、工作电压:5V5、LED驱动模式:共阴驱动三色RGB模块电路原理图如下: 三色LED模块电路原理图如下:2、实验硬件连接 模块引脚标注: 其中R、G、

2、B三个引脚为输入引脚,分别控制着红、绿、蓝三个颜色的发光强度。通过程序控制这三个引脚的输入占空比,即可实现LED发出合成的某个颜色的光。硬件连接:3、 试验程序在lib组件中添加librariesSTM32F10x_StdPeriph_Driversrc下的misc.c、stm32f10x_rcc.c、stm32f10x_gpio.c、stm32f10x_tim.c文件。main.c文件如下:#include "stm32f10x.h"void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_C

3、onfiguration(void);void TIM3_Configuration(void);/定时器3初始化函数void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/*GPIOA Configuration: TIM3 channel1*/ /设置该引脚为复用输出功能,输出TIM3 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /TIM_CH1 PA6GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用

4、推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*GPIOA Configuration: TIM3 channel2*/ /设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; /TIM_CH2 PA7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出GPIO_InitStructure.GPIO_S

5、peed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*GPIOB Configuration: TIM3 channel4*/ /设置该引脚为复用输出功能,输出TIM3 CH4的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /TIM_CH4 PB1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_

6、Init(GPIOB, &GPIO_InitStructure);/系统中断管理void NVIC_Configuration(void) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/设置优先级分组:先占优先级0位,从优先级4位/设置向量表的位置和偏移#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif/配置系统时钟,使能各外设时钟void RC

7、C_Configuration(void)SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); /使能GPIO外设和AFIO复用功能模块时钟使能void TIM3_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitTypeDef TIM_OCI

8、nitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_DeInit(TIM3); TIM_InternalClockConfig(TIM3); TIM_TimeBaseStructure.TIM_Period = 10000; /设置在下一个更新事件装入活动的自动重装载寄存器周期的值 /TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间TIM_TimeBaseStructure.TIM_Prescaler =0; /设置用来作为TIMx时钟

9、频率除数的预分频值 不分频/TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上计数模式,TIM_CounterMode_DownTIM向下计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /根据TIM_TimeBaseInitStruct中指定的参数

10、初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; /选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /比较输出使能TIM_OCInitStructure.TIM_Pulse = 0; /设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; /输出极性:TIM输出比较极性高TIM_OC2Init(TIM3, &a

11、mp;TIM_OCInitStructure); /根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /使能TIMx在CCR1上的预装载寄存器 TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_

12、OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE); /使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM3, ENABLE); /使能TIMx外设/配置所有外设void Init_All_Periph(void)RCC_Configuration();NVIC_Configuration();GPIO_Configuration();TIM3_Configuration();void Delay(vu32 nCount)for(; nCount != 0; nCount-);void Delay_Ms(uint16_t time)

13、 /ms延时函数 uint16_t i,j;for(i=0;i<time;i+) for(j=0;j<10260;j+);int main(void) u16 a=1000;unsigned char b=0;Init_All_Periph();while(1)Delay_Ms(10);/无论这里是多少,占空比都不会变。if(b=0)a=a+100;elsea=a-100;if(a>8000)a=8000;b=1;else if(a<1000)a=1000;b=0;TIM_SetCompare1(TIM3,a); TIM_SetCompare2(TIM3,a);/通过改

14、变TIM3->CCR2的值来改变占空比,从而控制LED的亮度 占空比的设定和程序其他部分无关!TIM_SetCompare4(TIM3,a);#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t* file, uint32_t line) while (1) #endif4、实验结果 随pwm信号占空比的不断变化,信号灯发光颜色和强度不断变化。 三色RGB模块:三色LED模块: 二十九、红外发射与接收模块实验1、模块介绍 红外发射和接收模块在我们的日常生活中扮演着重要的角色,现在很多的家用电器上都用到了这种装置,比如空调、电视、DVD等等,就是

15、基于它的无线遥感,而且还可以较远距离控制,使用起来非常的方便,本次实验我们来学习一下它的原理及具体如何使用。 红外发射管也称红外线发射二极管,它属于二级管类,可将电能直接转换成近红外光并能辐射出去的发光器件,它的结构、原理与普通的发光二级管相近,只是使用的半导体材料不同。 红外接收头是集接收,放大,解调一体的器件,它内部IC就已经完成了解调,输出的就是数字信号。红外接收头内部有两个重要元件,分别是IC和PD。IC是接收头的处理元件,主要由硅晶和电路组成,是一个高度集成的器件、主要功能有滤波、整形、解码、放大等功能。PD是光敏二极管,主要功能是接收光信号。下面是简略的工作原理图。红外发射二极管将

16、调制好的信号发射出去,红外接收头经接收、解码、滤波等一系列操作之后将信号恢复。红外发射管与接收头应配对使用,否则会影响灵敏度。红外发射模块电路原理图如下:红外接收模块电路原理图如下: 2、实验硬件连接 模块引脚图: 硬件连接图:3、 实验程序在lib组件中添加librariesSTM32F10x_StdPeriph_Driversrc下的misc.c、stm32f10x_rcc.c、stm32f10x_gpio.c文件。在user->src目录下新建delay.c和led.c文件,并在user->inc目录下新建对应的.h文件,将delay.c和led.c文件添加到user组件中。

17、编写delay.c文件#include "delay.h"void delay_us(u16 time) u16 i=0; while(time-) i=10; while(i-) ; void delay_ms(u16 time) u16 i=0; while(time-) i=12000; while(i-) ; 编写delay.h文件#ifndef _DELAY_H#define_DELAY_H#include "stm32f10x.h"void delay_us(u16 time);void delay_ms(u16 time);#endif 编

18、写led.c文件#include "led.h"/* * 函数名:LED_GPIO_Config * 描述 :配置LED用到的I/O口 * 输入 :无 * 输出 :无 */void LED_GPIO_Config(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out

19、_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);编写led.h文件#ifndef _LED_H#define_LED_H#include "stm32f10x.h"#define LED1(a)if (a)GPIO_SetBits(GPIOA,GPIO_Pin_0);elseGPIO_ResetBits(GPIOA,GPIO_Pin_0)void LED_GPIO_Config(void);#endif 编写主函数#include

20、 "stm32f10x.h"#include "led.h"#include "delay.h"int main(void) u16 k,j,i; SystemInit(); LED_GPIO_Config(); while(1) for(k = 0;k < 100;k+)for(i = 0;i < 2000;i+);for(j=0;j<26;j+)/大约38KHzGPIO_WriteBit(GPIOA,GPIO_Pin_1,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA, GP

21、IO_Pin_1); /发射管输出for(i = 0;i < 6;i+)delay_us(1); 4、实验结果 38K红外发射头发射的信号波形如下,其中,第一张图为示波器横轴调为10ms观察结果,第二张图为示波器横轴调为100um观察结果三十、旋转编码器模块实验1、模块介绍 旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。工作原理:增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。在Eltra编码器中角位移的转换采用了光电扫

22、描原理。读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上。接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。 增量编码器给出两相方波,它们的相位差90°,通常称为A通

23、道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比,得到旋转方向的信息。还有一个特殊信号称为Z或零通道,该通道给出编码器的绝对零位,此信号是一个方波与A通道方波的中心线重合。增量编码器 顺时针运动逆时针运动A B1 10 10 01 0A B1 11 00 00 1 增量型编码器精度取决于机械和电气两种因素,这些因素有:光栅分度误差、光盘偏心、轴承偏心、电子读数装置引入的误差以及光学部分的不精确性。确定编码器精度的测量单位是电气上的度数,编码器精度决定了编码器产生的脉冲分度。以下用360°电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要

24、知道多少机械角度相当于电气上的360度,可以用下列公式来计算:电气360 =机械360°/n°脉冲/转。 图:A、B换向时信号 编码器分度误差是以电气角度为单位的两个连续脉冲波的最大偏移来表示。误差存在于任何编码器中,这是由前述各因素引起的。Eltra编码器的最大误差为±25电气角度(在已声明的任何条件下),相当于额定值偏移±7%,至于相位差90°(电气上)的两个通道的最大偏差为±35电气度数相当于额定值偏移±10%左右。除了上述传统的编码器外,还有一些是与其它的电气输出信号集成在一起的增量型编码器。与UVW信号集成的增量型

25、编码器就是实例,它通常应用于交流伺服电机的反馈。这些磁极信号一般出现在交流伺服电机中,UVW信号一般是通过模拟磁性原件的功能而设计的。在Eltra编码器中,这些UVW信号是用光学方法产生,并以三个方波的形式出现,它们彼此偏移120°。为了便于电机启动,控制电动机用的启动器需要这些正确的信号。这些UVW磁极脉冲可在机械轴旋转中重复许多次,因为它们直接取决于所连接的电机磁极数,并且用于4、6或更多极电机的UVW信号。模块电路原理图如下:2、实验硬件连接模块引脚图: 硬件连接图: 3、 实验程序之前的例程都是基于库函数写的,旋转编码器实验我们基于寄存器编写函数。基于寄存器的实验建立工程和基

26、于库函数建工程有些差别。首先我们还是要新建一个文件夹(如encoder),在此文件夹下新建两个文件夹分别为system和user,编码器实验要用到延时,定时器和串口,所以我们在system文件夹下新建四个文件夹如下图:分别在各个文件夹内新建同名的.c和.h文件并在sys文件夹下添加下图中的头文件在user文件加下新建test.c,并添加startup_stm32f10x_hd.s文件文件都添加好后,开始新建工程,将工程文件保存在user目录下,并添加组件startup,user和system,在组件中添加文件如下图:组件添加好后进行工程设置,打开工程设置中的C/C+对话框,define设置如下

27、:Include path配置如下:打开工程配置->Target对话框 勾选Use MicroLIB其他配置和原来讲的一样。全都配置好之后就可以编写程序了编写delay.c文件#include "delay.h"static u8 fac_us=0;/us延时倍乘数static u16 fac_ms=0;/ms延时倍乘数/初始化延迟函数/SYSTICK的时钟固定为HCLK时钟的1/8/SYSCLK:系统时钟void delay_init(u8 SYSCLK)SysTick->CTRL&=0xfffffffb;fac_us=SYSCLK/8; fac_ms

28、=(u16)fac_us*1000; /延时nmsvoid delay_ms(u16 nms) u32 temp; SysTick->LOAD=(u32)nms*fac_ms;SysTick->VAL =0x00; /清空计数器SysTick->CTRL=0x01 ; /开始倒数 dotemp=SysTick->CTRL;while(temp&0x01&&!(temp&(1<<16);/等待时间到达 SysTick->CTRL=0x00; /关闭计数器SysTick->VAL =0X00; /清空计数器 /延时nu

29、s void delay_us(u32 nus)u32 temp; SysTick->LOAD=nus*fac_us; /时间加载 SysTick->VAL=0x00; /清空计数器SysTick->CTRL=0x01 ; /开始倒数 dotemp=SysTick->CTRL;while(temp&0x01&&!(temp&(1<<16);/等待时间到达 SysTick->CTRL=0x00; /关闭计数器SysTick->VAL =0X00; /清空计数器 编写delay.h文件#ifndef _DELAY_H#

30、define _DELAY_H #include "sys.h" void delay_init(u8 SYSCLK);void delay_ms(u16 nms);void delay_us(u32 nus);#endif编写usart.c文件#include "sys.h"#include "usart.h"#if 1#pragma import(_use_no_semihosting) /标准库需要的支持函数 struct _FILE int handle; ; FILE _stdout; _sys_exit(int x) x

31、= x; /重定义fputc函数 int fputc(int ch, FILE *f) USART1->DR = (u8) ch; while(USART1->SR&0X40)=0);/循环发送,直到发送完毕 return ch;#endif #ifdef EN_USART1_RX /如果使能了接收/串口1中断服务程序u8 USART_RX_BUFUSART_REC_LEN; /接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 u16 USART_RX_STA; /接收状态标记 void USART1_IRQHandler(void)u8 res; if(US

32、ART1->SR&(1<<5)/接收到数据 res=USART1->DR; if(USART_RX_STA&0x80)=0)/接收未完成if(USART_RX_STA&0x40)if(res!=0x0a)USART_RX_STA=0;/接收错误,重新开始else USART_RX_STA|=0x80;/接收完成了 else if(res=0x0d)USART_RX_STA|=0x40;elseUSART_RX_BUFUSART_RX_STA&0X3F=res;USART_RX_STA+;if(USART_RX_STA>63)USAR

33、T_RX_STA=0;/接收数据错误,重新开始接收 #endif void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);mantissa=temp; /得到整数部分fraction=(temp-mantissa)*16; /得到小数部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; /使能PORTA口时钟 RCC->APB2ENR

34、|=1<<14; /使能串口时钟 GPIOA->CRH=0X444444B4;/IO状态设置 RCC->APB2RSTR|=1<<14; /复位串口1RCC->APB2RSTR&=(1<<14);/停止复位 /波特率设置 USART1->BRR=mantissa; / 波特率设置 USART1->CR1|=0X200C; /1位停止,无校验位.#ifdef EN_USART1_RX /如果使能了接收/使能接收中断USART1->CR1|=1<<8; USART1->CR1|=1<<5;

35、 /接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQn,2);/组2,最低优先级 #endif编写usart.h文件#ifndef _USART_H#define _USART_H#include "sys.h"#include "stdio.h" #define USART_REC_LEN 200 /定义最大接收字节数 200#define EN_USART1_RX 1/使能(1)/禁止(0)串口1接收 extern u8 USART_RX_BUFUSART_REC_LEN; extern u16 USART_RX_STA

36、; void uart_init(u32 pclk2,u32 bound);#endif 编写timer.c文件#include "timer.h"#include "usart.h"void Encoder_Init(u16 arr) RCC->APB1ENR|=1<<1;/TIM3时钟使能 RCC->APB2ENR|=1<<2; /使能PORTA时钟 TIM3->ARR=arr; /设定计数器自动重装值/刚好1ms TIM3->DIER|=1<<0; /允许更新中断TIM3->DIER

37、|=1<<6; /允许触发中断GPIOA->CRL&=0XF0FFFFFF;/PA6GPIOA->CRL|=0X04000000;/浮空输入GPIOA->CRL&=0X0FFFFFFF;/PA7GPIOA->CRL|=0X40000000;/浮空输入TIM3->CCMR1 |= 1<<0; /CC1S='01' IC1FP1映射到TI1TIM3->CCMR1 |= 1<<8; /CC2S='01' IC2FP2映射到TI2TIM3->CCER &= (1<

38、<1);/CC1P='0'IC1FP1不反相,IC1FP1=TI1TIM3->CCER &= (1<<5);/CC2P='0'IC2FP2不反相,IC2FP2=TI2TIM3->CCMR1 |= 1<<4; /IC1F='0001' 输入捕获1滤波器TIM3->CCMR1 |= 1<<12; /IC2F='0001' 输入捕获2滤波器TIM3->SMCR |= 3<<0;/SMS='011' 所有的输入均在上升沿和下降沿有效 TI

39、M3->CR1|=0x01; /使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQn,2);/抢占1,子优先级3,组2 编写timer.h文件#ifndef _TIMER_H#define _TIMER_H#include "sys.h"void Encoder_Init(u16 arr);void PWM_Init(u16 arr,u16 psc);#endif编写sys.c文件#include "sys.h" void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset) SCB

40、->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);/设置NVIC分组/NVIC_Group:NVIC分组 04 总共5组 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) u32 temp,temp1; temp1=(NVIC_Group)&0x07;temp1<<=8;temp=SCB->AIRCR; temp&=0X0000F8FF; temp|=0X05FA0000; temp|=temp1; SCB->AIRCR=temp; void MY

41、_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) u32 temp;MY_NVIC_PriorityGroupConfig(NVIC_Group);temp=NVIC_PreemptionPriority<<(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);temp&=0xf; NVIC->ISERNVIC_Channel/32|=(1<<NVI

42、C_Channel%32);NVIC->IPNVIC_Channel|=temp<<4; void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) u8 EXTADDR;u8 EXTOFFSET;EXTADDR=BITx/4;EXTOFFSET=(BITx%4)*4; RCC->APB2ENR|=0x01; AFIO->EXTICREXTADDR&=(0x000F<<EXTOFFSET);AFIO->EXTICREXTADDR|=GPIOx<<EXTOFFSET;EXTI->IMR|=1

43、<<BITx; if(TRIM&0x01)EXTI->FTSR|=1<<BITx;if(TRIM&0x02)EXTI->RTSR|=1<<BITx; void MYRCC_DeInit(void) RCC->APB1RSTR = 0x00000000; RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014; RCC->APB2ENR = 0x00000000; RCC->APB1ENR = 0x00000000; RCC->CR |= 0x00

44、000001; RCC->CFGR &= 0xF8FF0000; RCC->CR &= 0xFEF6FFFF; RCC->CR &= 0xFFFBFFFF; RCC->CFGR &= 0xFF80FFFF; RCC->CIR = 0x00000000; #ifdef VECT_TAB_RAMMY_NVIC_SetVectorTable(0x20000000, 0x0);#else MY_NVIC_SetVectorTable(0x08000000,0x0);#endifvoid WFI_SET(void)_ASM volatile(

45、"wfi"); void INTX_DISABLE(void) _ASM volatile("cpsid i");void INTX_ENABLE(void)_ASM volatile("cpsie i"); void Sys_Standby(void)SCB->SCR|=1<<2; RCC->APB1ENR|=1<<28; PWR->CSR|=1<<8; PWR->CR|=1<<2; PWR->CR|=1<<1; WFI_SET(); void

46、 Sys_Soft_Reset(void) SCB->AIRCR =0X05FA0000|(u32)0x04; void JTAG_Set(u8 mode)u32 temp;temp=mode;temp<<=25;RCC->APB2ENR|=1<<0; AFIO->MAPR&=0XF8FFFFFF; AFIO->MAPR|=temp; void Stm32_Clock_Init(u8 PLL)unsigned char temp=0; MYRCC_DeInit(); RCC->CR|=0x00010000; while(!(RCC-

47、>CR>>17);RCC->CFGR=0X00000400; PLL-=2; RCC->CFGR|=PLL<<18; RCC->CFGR|=1<<16; FLASH->ACR|=0x32; RCC->CR|=0x01000000; while(!(RCC->CR>>25);RCC->CFGR|=0x00000002; while(temp!=0x02) temp=RCC->CFGR>>2;temp&=0x03; 编写sys.h文件#ifndef _SYS_H#define

48、_SYS_H #include <stm32f10x.h> #define BITBAND(addr, bitnum) (addr & 0xF0000000)+0x2000000+(addr &0xFFFFF)<<5)+(bitnum<<2) #define MEM_ADDR(addr) *(volatile unsigned long *)(addr) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum) /IO口地址映射#define GPIOA_ODR_Addr (G

49、PIOA_BASE+12) /0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) /0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) /0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) /0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) /0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) /0x40011A0C #define GPIOG_ODR_A

50、ddr (GPIOG_BASE+12) /0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) /0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) /0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) /0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) /0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) /0x40011808 #define GPIOF_IDR_

51、Addr (GPIOF_BASE+8) /0x40011A08 #define GPIOG_IDR_Addr (GPIOG_BASE+8) /0x40011E08 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) /输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) /输入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) /输出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) /输入 #define PCout(n) BIT_ADDR(GP

52、IOC_ODR_Addr,n) /输出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) /输入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) /输出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) /输入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) /输出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) /输入#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) /输出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) /输入#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) /输出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) /输入#define GPIO_A 0#define GPIO_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论