[精品书单]用STM 32写的编码器

最近用了stm32写的编码器,今天分享一下...........

代码

主函数

 1 #include "led.h"
 2 #include "delay.h"
 3 #include "key.h"
 4 #include "sys.h"
 5 #include "usart.h"
 6 #include "exti.h"
 7 #include "encode.h"
 8 
 9 
10  int main(void)
11  {        
12     
13     u16 count;//编码器计数
14     delay_init();             //延时函数初始化
15     uart_init(115200);     //串口初始化为115200
16     EXTI_PA1_Config();//编码器z相归零信号外部中断信号初始化
17 TIM4_Init();//定时器编码器接口初始化
18 LED_Init(); //LED端口初始化 19 KEY_Init(); //初始化与按键连接的硬件端口
20 while(1) 21 { 22 count = TIM4->CNT/4;//获取计数值
23 delay_ms(1000);//每个一秒打印一次值
24 printf("count = %d\n",count); 25 } 26 }

其他函数配置代码

encode.c函数

 1 #include "stm32f10x.h"
 2 #include "encode.h"
 3 #include "misc.h"
 4 #include "nvic.h"
 5 #include "sys.h" 
 6 #include "delay.h"
 7 
 8 void TIM4_Mode_Config(void)
 9 {
10     GPIO_InitTypeDef GPIO_InitStructure;
11     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
12     TIM_ICInitTypeDef TIM_ICInitStructure;       
13 
14     //PB6 ch1  A,PB7 ch2 
15     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使用TIM4时钟    
16     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使用GPIOA时钟
17     
18     GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中参数按缺省值输入
19 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 20 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 PA7浮空输入 21 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 22 GPIO_Init(GPIOB, &GPIO_InitStructure); 23 24 NVIC_Config(2); 25 26 TIM_DeInit(TIM4); 27 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 28 TIM_TimeBaseStructure.TIM_Period = 359*4; //设定计数器装载值 TIMx_ARR = 359*4 29 TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM3时钟预分频值
30 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//设置时钟分割 T_dts = T_ck_int 31 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
32 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 33 34 TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数 35 TIM_ICStructInit(&TIM_ICInitStructure);//将结构中的内容按缺省输入
36 TIM_ICInitStructure.TIM_ICFilter = 6; //选择输入比较滤波器
37 TIM_ICInit(TIM4, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM3 38 39 // TIM_ARRPreloadConfig(TIM4, ENABLE);//使能装载值
40 TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM3的更新标志位
41 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//运行更新阶段
42 //Reset counter 43 TIM4->CNT = 0;// 44 45 TIM_Cmd(TIM4, ENABLE); //启动TIM4定时器 46 47 } 48 49 void TIM4_Init(void) 50 { 51 TIM4_Mode_Config(); 52 }

 

encode.h函数

1 #ifndef __ENCODE_H__
2 #define __ENCODE_H__
3 #include "sys.h" 
4 void TIM4_Mode_Config(void);//模式配置
5 void TIM4_Init(void);//初始化
6 7 8 #endif

 

 

 

nvic.c函数

 1 #include "stm32f10x.h"
 2 #include "misc.h"
 3 #include "nvic.h"
 4 #include "sys.h" 
 5 #include "delay.h"
 6 /*
 7 中断分配说明,优先级由高到低排
8 顺序 类型 作用 抢占优先级 响应优先级
9 1 EXTI1 编码器Z相归零 0 0 10 2 TIM4 定时器的编码器模式 1 1 11 3 USART1 串口通信中断 2 1 12 */ 13 14 //1.-----Z信号归零 PA1 15 void PA_NVIC_Config(NVIC_InitTypeDef NVIC_InitStructure1) 16 { 17 18 NVIC_InitStructure1.NVIC_IRQChannel = EXTI1_IRQn; 19 NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0; 20 NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0; 21 NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE; 22 NVIC_Init(&NVIC_InitStructure1); 23 } 24 25 26 //2----定时器的编码器接口模式,对编码器进行计数
27 void TIM4_NVIC_Config(NVIC_InitTypeDef NVIC_InitStructure2) 28 { 29 NVIC_InitStructure2.NVIC_IRQChannel = TIM4_IRQn; 30 NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1; 31 NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; 32 NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE; 33 NVIC_Init(&NVIC_InitStructure2); 34 35 } 36 37 38 //3----串口一通信用于Modbus-Rtu-485S 39 void USART1_NVIC_Config(NVIC_InitTypeDef NVIC_InitStructure4) 40 { 41 NVIC_InitStructure4.NVIC_IRQChannel = USART1_IRQn; 42 NVIC_InitStructure4.NVIC_IRQChannelPreemptionPriority = 2; 43 NVIC_InitStructure4.NVIC_IRQChannelSubPriority = 1; 44 NVIC_InitStructure4.NVIC_IRQChannelCmd = ENABLE; 45 NVIC_Init(&NVIC_InitStructure4); 46 } 47 48 49 void NVIC_Config(u8 Interrupt_flag) 50 { 51 52 NVIC_InitTypeDef NVIC_InitStructure; 53 /* 配置中断使用组合 抢占式3位(0-7)响应式1位(0-1) */ 54 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 55 56 if(Interrupt_flag == 1) 57 { 58 /*外部中断1 Z相归零----优先级最高 0 0*/ 59 PA_NVIC_Config(NVIC_InitStructure); 60 } 61 62 if(Interrupt_flag == 2) 63 { 64 /*TIM4中断编码器解码----优先级 1 1*/ 65 TIM4_NVIC_Config(NVIC_InitStructure); 66 } 67 if(Interrupt_flag == 3) 68 { 69 /* USART1中断接收数据----优先级 2 1*/ 70 USART1_NVIC_Config(NVIC_InitStructure); 71 } 72 }

nvic.h函数

 

 1 #ifndef __NVIC_H__
 2 #define __NVIC_H__
 3 
 4 #include "sys.h" 
 5 #include "stm32f10x.h"
 6 
 7 void NVIC_Config(u8 Interrupt_flag);//中断配置
 8 
 9 
10 
11 #endif

 

 

 

exti.c函数

 

 1 #include "exti.h"
 2 #include "nvic.h"
 3 #include "led.h"
 4 #include "sys.h" 
 5 #include "delay.h"
 6 
 7 //Z相归零
8 void EXTI_PA1_Config(void) 9 { 10 GPIO_InitTypeDef GPIO_InitStructure; 11 EXTI_InitTypeDef EXTI_InitStructure; 12 13 /* config the extiline(PA1) clock and AFIO clock */ 14 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO,ENABLE); 15 /* config the NVIC(PA1) */ 16 NVIC_Config(1); 17 18 /* EXTI line gpio config(PA1) */ 19 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 20 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
21 GPIO_Init(GPIOA, &GPIO_InitStructure); 22 23 /* EXTI line(PA1) mode config */ 24 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); 25 EXTI_InitStructure.EXTI_Line = EXTI_Line1; 26 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 27 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断 28 EXTI_InitStructure.EXTI_LineCmd = ENABLE; 29 EXTI_Init(&EXTI_InitStructure); 30 }

exti.h函数

 

1 #ifndef __EXTI_H__
2 #define __EXTI_H__
3 #include "sys.h" 
4 #include "stm32f10x.h"
5 
6 
7 void EXTI_PA1_Config(void);//编码器Z相归零
8 9 #endif

 

代码结束

 

posted @ 2016-12-28 18:14  邵运忠  阅读(594)  评论(0编辑  收藏  举报