




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 二十八、三色RGB與三色LED模塊實(shí)驗(yàn)1、模塊介紹這兩個(gè)模塊都是通過R、G、B三個(gè)引腳的PWM電壓輸入來調(diào)節(jié)三種基色(紅/藍(lán)/綠)的強(qiáng)度從而實(shí)現(xiàn)全彩的混色效果,從而可以產(chǎn)生任意一種顏色。三色RGB模塊由一個(gè)貼片全彩LED制成,三色LED模塊由一個(gè)插件全彩LED制成。用STM32開發(fā)板通過程序?qū)@兩個(gè)模塊進(jìn)行控制可實(shí)現(xiàn)酷炫的燈光效果。產(chǎn)品特性:1、RGB三基色接限流電阻防止燒壞2、通過PWM調(diào)節(jié)三基色可混合得到不同的顏色3、可與各種單片機(jī)接口4、工作電壓:5V5、LED驅(qū)動(dòng)模式:共陰驅(qū)動(dòng)三色RGB模塊電路原理圖如下: 三色LED模塊電路原理圖如下:2、實(shí)驗(yàn)硬件連接 模塊引腳標(biāo)注: 其中R、G、
2、B三個(gè)引腳為輸入引腳,分別控制著紅、綠、藍(lán)三個(gè)顏色的發(fā)光強(qiáng)度。通過程序控制這三個(gè)引腳的輸入占空比,即可實(shí)現(xiàn)LED發(fā)出合成的某個(gè)顏色的光。硬件連接:3、 試驗(yàn)程序在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);/定時(shí)器3初始化函數(shù)void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/*GPIOA Configuration: TIM3 channel1*/ /設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH1的PWM脈沖波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /TIM_CH1 PA6GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /復(fù)用
4、推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*GPIOA Configuration: TIM3 channel2*/ /設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH2的PWM脈沖波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; /TIM_CH2 PA7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /復(fù)用推挽輸出GPIO_InitStructure.GPIO_S
5、peed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*GPIOB Configuration: TIM3 channel4*/ /設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH4的PWM脈沖波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /TIM_CH4 PB1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /復(fù)用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_
6、Init(GPIOB, &GPIO_InitStructure);/系統(tǒng)中斷管理void NVIC_Configuration(void) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/設(shè)置優(yōu)先級(jí)分組:先占優(yōu)先級(jí)0位,從優(yōu)先級(jí)4位/設(shè)置向量表的位置和偏移#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif/配置系統(tǒng)時(shí)鐘,使能各外設(shè)時(shí)鐘void RC
7、C_Configuration(void)SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); /使能GPIO外設(shè)和AFIO復(fù)用功能模塊時(shí)鐘使能void TIM3_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位TIM_OCInitTypeDef TIM_OCI
8、nitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_DeInit(TIM3); TIM_InternalClockConfig(TIM3); TIM_TimeBaseStructure.TIM_Period = 10000; /設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 /TIM_Period設(shè)置了在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間TIM_TimeBaseStructure.TIM_Prescaler =0; /設(shè)置用來作為TIMx時(shí)鐘
9、頻率除數(shù)的預(yù)分頻值 不分頻/TIM_Prescaler設(shè)置了用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值。它的取值必須在0x0000和0xFFFF之間TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上計(jì)數(shù)模式,TIM_CounterMode_DownTIM向下計(jì)數(shù)模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)
10、初始化TIMx的時(shí)間基數(shù)單位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; /選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /比較輸出使能TIM_OCInitStructure.TIM_Pulse = 0; /設(shè)置待裝入捕獲比較寄存器的脈沖值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; /輸出極性:TIM輸出比較極性高TIM_OC2Init(TIM3, &a
11、mp;TIM_OCInitStructure); /根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化外設(shè)TIMxTIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /使能TIMx在CCR1上的預(yù)裝載寄存器 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上的預(yù)裝載寄存器TIM_Cmd(TIM3, ENABLE); /使能TIMx外設(shè)/配置所有外設(shè)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延時(shí)函數(shù) 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);/無論這里是多少,占空比都不會(huì)變。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的亮度 占空比的設(shè)定和程序其他部分無關(guān)!TIM_SetCompare4(TIM3,a);#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t* file, uint32_t line) while (1) #endif4、實(shí)驗(yàn)結(jié)果 隨pwm信號(hào)占空比的不斷變化,信號(hào)燈發(fā)光顏色和強(qiáng)度不斷變化。 三色RGB模塊:三色LED模塊: 二十九、紅外發(fā)射與接收模塊實(shí)驗(yàn)1、模塊介紹 紅外發(fā)射和接收模塊在我們的日常生活中扮演著重要的角色,現(xiàn)在很多的家用電器上都用到了這種裝置,比如空調(diào)、電視、DVD等等,就是
15、基于它的無線遙感,而且還可以較遠(yuǎn)距離控制,使用起來非常的方便,本次實(shí)驗(yàn)我們來學(xué)習(xí)一下它的原理及具體如何使用。 紅外發(fā)射管也稱紅外線發(fā)射二極管,它屬于二級(jí)管類,可將電能直接轉(zhuǎn)換成近紅外光并能輻射出去的發(fā)光器件,它的結(jié)構(gòu)、原理與普通的發(fā)光二級(jí)管相近,只是使用的半導(dǎo)體材料不同。 紅外接收頭是集接收,放大,解調(diào)一體的器件,它內(nèi)部IC就已經(jīng)完成了解調(diào),輸出的就是數(shù)字信號(hào)。紅外接收頭內(nèi)部有兩個(gè)重要元件,分別是IC和PD。IC是接收頭的處理元件,主要由硅晶和電路組成,是一個(gè)高度集成的器件、主要功能有濾波、整形、解碼、放大等功能。PD是光敏二極管,主要功能是接收光信號(hào)。下面是簡(jiǎn)略的工作原理圖。紅外發(fā)射二極管將
16、調(diào)制好的信號(hào)發(fā)射出去,紅外接收頭經(jīng)接收、解碼、濾波等一系列操作之后將信號(hào)恢復(fù)。紅外發(fā)射管與接收頭應(yīng)配對(duì)使用,否則會(huì)影響靈敏度。紅外發(fā)射模塊電路原理圖如下:紅外接收模塊電路原理圖如下: 2、實(shí)驗(yàn)硬件連接 模塊引腳圖: 硬件連接圖:3、 實(shí)驗(yàn)程序在lib組件中添加librariesSTM32F10x_StdPeriph_Driversrc下的misc.c、stm32f10x_rcc.c、stm32f10x_gpio.c文件。在user->src目錄下新建delay.c和led.c文件,并在user->inc目錄下新建對(duì)應(yīng)的.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"/* * 函數(shù)名: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 編寫主函數(shù)#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); /發(fā)射管輸出for(i = 0;i < 6;i+)delay_us(1); 4、實(shí)驗(yàn)結(jié)果 38K紅外發(fā)射頭發(fā)射的信號(hào)波形如下,其中,第一張圖為示波器橫軸調(diào)為10ms觀察結(jié)果,第二張圖為示波器橫軸調(diào)為100um觀察結(jié)果三十、旋轉(zhuǎn)編碼器模塊實(shí)驗(yàn)1、模塊介紹 旋轉(zhuǎn)編碼器可通過旋轉(zhuǎn)可以計(jì)數(shù)正方向和反方向轉(zhuǎn)動(dòng)過程中輸出脈沖的次數(shù),旋轉(zhuǎn)計(jì)數(shù)不像電位計(jì),這種轉(zhuǎn)動(dòng)計(jì)數(shù)是沒有限制的。配合旋轉(zhuǎn)編碼器上的按鍵,可以復(fù)位到初始狀態(tài),即從0開始計(jì)數(shù)。工作原理:增量編碼器是一種將旋轉(zhuǎn)位移轉(zhuǎn)換為一連串?dāng)?shù)字脈沖信號(hào)的旋轉(zhuǎn)式傳感器。這些脈沖用來控制角位移。在Eltra編碼器中角位移的轉(zhuǎn)換采用了光電掃
22、描原理。讀數(shù)系統(tǒng)以由交替的透光窗口和不透光窗口構(gòu)成的徑向分度盤(碼盤)的旋轉(zhuǎn)為依據(jù),同時(shí)被一個(gè)紅外光源垂直照射,光把碼盤的圖像投射到接收器表面上。接收器覆蓋著一層衍射光柵,它具有和碼盤相同的窗口寬度。接收器的工作是感受光盤轉(zhuǎn)動(dòng)所產(chǎn)生的變化,然后將光變化轉(zhuǎn)換成相應(yīng)的電變化。再使低電平信號(hào)上升到較高電平,并產(chǎn)生沒有任何干擾的方形脈沖,這就必須用電子電路來處理。讀數(shù)系統(tǒng)通常采用差分方式,即將兩個(gè)波形一樣但相位差為180°的不同信號(hào)進(jìn)行比較,以便提高輸出信號(hào)的質(zhì)量和穩(wěn)定性。讀數(shù)是再兩個(gè)信號(hào)的差別基礎(chǔ)上形成的,從而消除了干擾。 增量編碼器給出兩相方波,它們的相位差90°,通常稱為A通
23、道和B通道。其中一個(gè)通道給出與轉(zhuǎn)速相關(guān)的信息,與此同時(shí),通過兩個(gè)通道信號(hào)進(jìn)行順序?qū)Ρ龋玫叫D(zhuǎn)方向的信息。還有一個(gè)特殊信號(hào)稱為Z或零通道,該通道給出編碼器的絕對(duì)零位,此信號(hào)是一個(gè)方波與A通道方波的中心線重合。增量編碼器 順時(shí)針運(yùn)動(dòng)逆時(shí)針運(yùn)動(dòng)A B1 10 10 01 0A B1 11 00 00 1 增量型編碼器精度取決于機(jī)械和電氣兩種因素,這些因素有:光柵分度誤差、光盤偏心、軸承偏心、電子讀數(shù)裝置引入的誤差以及光學(xué)部分的不精確性。確定編碼器精度的測(cè)量單位是電氣上的度數(shù),編碼器精度決定了編碼器產(chǎn)生的脈沖分度。以下用360°電氣度數(shù)來表示機(jī)械軸的轉(zhuǎn)動(dòng),而軸的轉(zhuǎn)動(dòng)必須是一個(gè)完整的周期。要
24、知道多少機(jī)械角度相當(dāng)于電氣上的360度,可以用下列公式來計(jì)算:電氣360 =機(jī)械360°/n°脈沖/轉(zhuǎn)。 圖:A、B換向時(shí)信號(hào) 編碼器分度誤差是以電氣角度為單位的兩個(gè)連續(xù)脈沖波的最大偏移來表示。誤差存在于任何編碼器中,這是由前述各因素引起的。Eltra編碼器的最大誤差為±25電氣角度(在已聲明的任何條件下),相當(dāng)于額定值偏移±7%,至于相位差90°(電氣上)的兩個(gè)通道的最大偏差為±35電氣度數(shù)相當(dāng)于額定值偏移±10%左右。除了上述傳統(tǒng)的編碼器外,還有一些是與其它的電氣輸出信號(hào)集成在一起的增量型編碼器。與UVW信號(hào)集成的增量型
25、編碼器就是實(shí)例,它通常應(yīng)用于交流伺服電機(jī)的反饋。這些磁極信號(hào)一般出現(xiàn)在交流伺服電機(jī)中,UVW信號(hào)一般是通過模擬磁性原件的功能而設(shè)計(jì)的。在Eltra編碼器中,這些UVW信號(hào)是用光學(xué)方法產(chǎn)生,并以三個(gè)方波的形式出現(xiàn),它們彼此偏移120°。為了便于電機(jī)啟動(dòng),控制電動(dòng)機(jī)用的啟動(dòng)器需要這些正確的信號(hào)。這些UVW磁極脈沖可在機(jī)械軸旋轉(zhuǎn)中重復(fù)許多次,因?yàn)樗鼈冎苯尤Q于所連接的電機(jī)磁極數(shù),并且用于4、6或更多極電機(jī)的UVW信號(hào)。模塊電路原理圖如下:2、實(shí)驗(yàn)硬件連接模塊引腳圖: 硬件連接圖: 3、 實(shí)驗(yàn)程序之前的例程都是基于庫函數(shù)寫的,旋轉(zhuǎn)編碼器實(shí)驗(yàn)我們基于寄存器編寫函數(shù)。基于寄存器的實(shí)驗(yàn)建立工程和基
26、于庫函數(shù)建工程有些差別。首先我們還是要新建一個(gè)文件夾(如encoder),在此文件夾下新建兩個(gè)文件夾分別為system和user,編碼器實(shí)驗(yàn)要用到延時(shí),定時(shí)器和串口,所以我們?cè)趕ystem文件夾下新建四個(gè)文件夾如下圖:分別在各個(gè)文件夾內(nèi)新建同名的.c和.h文件并在sys文件夾下添加下圖中的頭文件在user文件加下新建test.c,并添加startup_stm32f10x_hd.s文件文件都添加好后,開始新建工程,將工程文件保存在user目錄下,并添加組件startup,user和system,在組件中添加文件如下圖:組件添加好后進(jìn)行工程設(shè)置,打開工程設(shè)置中的C/C+對(duì)話框,define設(shè)置如下
27、:Include path配置如下:打開工程配置->Target對(duì)話框 勾選Use MicroLIB其他配置和原來講的一樣。全都配置好之后就可以編寫程序了編寫delay.c文件#include "delay.h"static u8 fac_us=0;/us延時(shí)倍乘數(shù)static u16 fac_ms=0;/ms延時(shí)倍乘數(shù)/初始化延遲函數(shù)/SYSTICK的時(shí)鐘固定為HCLK時(shí)鐘的1/8/SYSCLK:系統(tǒng)時(shí)鐘void delay_init(u8 SYSCLK)SysTick->CTRL&=0xfffffffb;fac_us=SYSCLK/8; fac_ms
28、=(u16)fac_us*1000; /延時(shí)nmsvoid delay_ms(u16 nms) u32 temp; SysTick->LOAD=(u32)nms*fac_ms;SysTick->VAL =0x00; /清空計(jì)數(shù)器SysTick->CTRL=0x01 ; /開始倒數(shù) dotemp=SysTick->CTRL;while(temp&0x01&&!(temp&(1<<16);/等待時(shí)間到達(dá) SysTick->CTRL=0x00; /關(guān)閉計(jì)數(shù)器SysTick->VAL =0X00; /清空計(jì)數(shù)器 /延時(shí)nu
29、s void delay_us(u32 nus)u32 temp; SysTick->LOAD=nus*fac_us; /時(shí)間加載 SysTick->VAL=0x00; /清空計(jì)數(shù)器SysTick->CTRL=0x01 ; /開始倒數(shù) dotemp=SysTick->CTRL;while(temp&0x01&&!(temp&(1<<16);/等待時(shí)間到達(dá) SysTick->CTRL=0x00; /關(guān)閉計(jì)數(shù)器SysTick->VAL =0X00; /清空計(jì)數(shù)器 編寫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) /標(biāo)準(zhǔn)庫需要的支持函數(shù) struct _FILE int handle; ; FILE _stdout; _sys_exit(int x) x
31、= x; /重定義fputc函數(shù) int fputc(int ch, FILE *f) USART1->DR = (u8) ch; while(USART1->SR&0X40)=0);/循環(huán)發(fā)送,直到發(fā)送完畢 return ch;#endif #ifdef EN_USART1_RX /如果使能了接收/串口1中斷服務(wù)程序u8 USART_RX_BUFUSART_REC_LEN; /接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符 u16 USART_RX_STA; /接收狀態(tài)標(biāo)記 void USART1_IRQHandler(void)u8 res; if(US
32、ART1->SR&(1<<5)/接收到數(shù)據(jù) res=USART1->DR; if(USART_RX_STA&0x80)=0)/接收未完成if(USART_RX_STA&0x40)if(res!=0x0a)USART_RX_STA=0;/接收錯(cuò)誤,重新開始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;/接收數(shù)據(jù)錯(cuò)誤,重新開始接收 #endif void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);mantissa=temp; /得到整數(shù)部分fraction=(temp-mantissa)*16; /得到小數(shù)部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; /使能PORTA口時(shí)鐘 RCC->APB2ENR
34、|=1<<14; /使能串口時(shí)鐘 GPIOA->CRH=0X444444B4;/IO狀態(tài)設(shè)置 RCC->APB2RSTR|=1<<14; /復(fù)位串口1RCC->APB2RSTR&=(1<<14);/停止復(fù)位 /波特率設(shè)置 USART1->BRR=mantissa; / 波特率設(shè)置 USART1->CR1|=0X200C; /1位停止,無校驗(yàn)位.#ifdef EN_USART1_RX /如果使能了接收/使能接收中斷USART1->CR1|=1<<8; USART1->CR1|=1<<5;
35、 /接收緩沖區(qū)非空中斷使能 MY_NVIC_Init(3,3,USART1_IRQn,2);/組2,最低優(yōu)先級(jí) #endif編寫usart.h文件#ifndef _USART_H#define _USART_H#include "sys.h"#include "stdio.h" #define USART_REC_LEN 200 /定義最大接收字節(jié)數(shù) 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時(shí)鐘使能 RCC->APB2ENR|=1<<2; /使能PORTA時(shí)鐘 TIM3->ARR=arr; /設(shè)定計(jì)數(shù)器自動(dòng)重裝值/剛好1ms TIM3->DIER|=1<<0; /允許更新中斷TIM3->DIER
37、|=1<<6; /允許觸發(fā)中斷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; /使能定時(shí)器3 MY_NVIC_Init(1,3,TIM3_IRQn,2);/搶占1,子優(yōu)先級(jí)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);/設(shè)置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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 車庫資產(chǎn)抵押擔(dān)保合同規(guī)范文本
- 殘疾人就業(yè)支持與職業(yè)培訓(xùn)合作協(xié)議
- 茶葉電商培訓(xùn)與人才輸送合作協(xié)議
- 特色美食餐廳服務(wù)員勞動(dòng)合同書
- 景區(qū)觀光出租車包車合同范本-深度游體驗(yàn)協(xié)議
- 高速公路服務(wù)區(qū)車位包銷及旅游觀光合作協(xié)議
- 西餐廳餐飲服務(wù)承包協(xié)議
- 廠房租賃及生產(chǎn)線技術(shù)輸出合同范本
- 住宅區(qū)拆遷房產(chǎn)權(quán)互換協(xié)議
- 網(wǎng)絡(luò)訂餐平臺(tái)食品安全責(zé)任書
- 《乘風(fēng)破浪的姐姐》招商方案
- 工業(yè)漆水性丙烯酸防護(hù)msds
- 2022年事業(yè)單位招聘考試(畜牧獸醫(yī))綜合試題庫及答案
- 球罐安裝工程施工技術(shù)方案
- 《民國(guó)人物大辭典》附名錄
- 消防管理制度的制作張貼規(guī)范及圖例
- DB4403∕T 199-2021 中醫(yī)藥健康文化宣教旅游示范基地評(píng)定規(guī)范
- 福州供電段接觸網(wǎng)設(shè)備檢修工藝
- 工裝治工具管理程序(含表格)
- 《辦公軟件應(yīng)用》培訓(xùn)計(jì)劃
- 基于QuartusII的多功能數(shù)字鐘設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論