01 |
#include |
02 |
#include "system.h" |
03 |
#include "tim.h" |
04 |
05 |
void Gpio_Init( void ); |
06 |
07 |
int main( void ) |
08 |
{ |
09 |
10 |
Rcc_Init(9); //系统时钟设置 |
11 |
//Usart1_Init(72,9600); //设置系统时钟和波特率 |
12 |
13 |
// 相关TIM_x,CCR_x参数定义tim.h文件 |
14 |
15 |
Tim_Init(TIM_2,65535,7199); //初始化TIM2定时器,设定重装值和分频值 |
16 |
17 |
Tim_CCR_Set(TIM_2,CCR_1,40000); |
18 |
Tim_CCR_Set(TIM_2,CCR_2,20000); |
19 |
Tim_CCR_Set(TIM_2,CCR_3,10000); |
20 |
Tim_CCR_Set(TIM_2,CCR_4,5000); |
21 |
|
22 |
Nvic_Init(0,0,TIM2_IRQChannel,0); //设置抢占优先级为0,响应优先级为0,中断分组为0 |
23 |
24 |
Gpio_Init(); |
25 |
26 |
while (1); |
27 |
28 |
} |
29 |
30 |
void Gpio_Init( void ) |
31 |
{ |
32 |
RCC->APB2ENR|=1<<2; //使能PORTA时钟 |
33 |
34 |
GPIOA->CRL&=0x0000FFFF; // PA0~3设置为浮空输入,PA4~7设置为推挽输出 |
35 |
GPIOA->CRL|=0x33334444; |
36 |
//GPIOA->ODR &=0xFFFFFFF0; |
37 |
|
38 |
//USART1 串口I/O设置 |
39 |
40 |
//GPIOA -> CRH&=0xFFFFF00F; //设置USART1 的Tx(PA.9)为第二功能推挽,50MHz;Rx(PA.10)为浮空输入 |
41 |
//GPIOA -> CRH|=0x000008B0; |
42 |
} |
01 |
#include "stm32f10x_it.h" |
02 |
#include "system.h" |
03 |
04 |
#define LED0 PAout(4) |
05 |
#define LED1 PAout(5) |
06 |
#define LED2 PAout(6) |
07 |
#define LED3 PAout(7) |
08 |
|
09 |
void TIM2_IRQHandler( void ) |
10 |
{ |
11 |
if (TIM2->SR&0x02) //捕获比较中断1触发 |
12 |
{ |
13 |
LED0 = !LED0; |
14 |
|
15 |
TIM2 ->CCR1 = TIM2 -> CNT + 40000; //更新捕获/比较1的值 |
16 |
17 |
TIM2->SR &= 0xFD; //清除捕获比较中断 |
18 |
} |
19 |
20 |
if (TIM2->SR&0x04) //捕获比较中断2触发 |
21 |
{ |
22 |
LED1 = !LED1; |
23 |
TIM2 ->CCR2 = TIM2 -> CNT + 20000; |
24 |
25 |
TIM2->SR &= 0xFB; //清除捕获比较中断 |
26 |
} |
27 |
28 |
if (TIM2->SR&0x08) //捕获比较中断3触发 |
29 |
{ |
30 |
LED2 = !LED2; |
31 |
32 |
TIM2 ->CCR3 = TIM2 -> CNT + 10000; |
33 |
TIM2->SR &= 0xF7; //清除捕获比较中断 |
34 |
|
35 |
} |
36 |
37 |
if (TIM2->SR&0x10) //捕获比较中断4触发 |
38 |
{ |
39 |
LED3 = !LED3; |
40 |
41 |
TIM2 ->CCR4 = TIM2 -> CNT + 5000; |
42 |
TIM2->SR &= 0x0F; //清除捕获比较中断 |
43 |
|
44 |
} |
45 |
|
46 |
TIM2->SR &= ~(1<<0); //清除中断 |
47 |
48 |
} |
001 |
#include |
002 |
#include "tim.h" |
003 |
004 |
//通用定时器初始化 |
005 |
//参数说明:TIM_x 为选择定时器 TIM_1为通用寄存器1又一次类推(定义于tim.h), arr为自动重装值 ;psc 为时钟预分频数 |
006 |
//待完善 目前只支持TIM2 |
007 |
void Tim_Init(u8 TIM_x,u16 arr,u16 psc) |
008 |
{ |
009 |
switch (TIM_x) |
010 |
{ |
011 |
case 1 :{ |
012 |
013 |
RCC->APB2ENR |=1<<11; |
014 |
015 |
break ; |
016 |
} |
017 |
018 |
case 2 :{ |
019 |
RCC->APB1ENR |=1<<0; |
020 |
021 |
TIM2->ARR = arr; //设定自动重装值 |
022 |
TIM2->PSC = psc; //设定预分频值 |
023 |
TIM2->DIER |= 1<<0; //允许更新中断 |
024 |
TIM2->DIER |= 1<<6; //允许触发中断 |
025 |
026 |
TIM2->CR1 |= 0x81; //使能定时器,自动重装允许 |
027 |
028 |
break ; |
029 |
} |
030 |
031 |
case 3 :{ |
032 |
RCC->APB1ENR |=1<<1; |
033 |
034 |
break ; |
035 |
} |
036 |
case 4 :{ |
037 |
RCC->APB1ENR |=1<<2; |
038 |
039 |
break ; |
040 |
} |
041 |
042 |
case 5 :{ |
043 |
RCC->APB1ENR |=1<<3; |
044 |
045 |
break ; |
046 |
} |
047 |
case 6 :{ |
048 |
049 |
RCC->APB1ENR |=1<<4; |
050 |
051 |
break ; |
052 |
} |
053 |
case 7 :{ |
054 |
055 |
RCC->APB1ENR |=1<<5; |
056 |
057 |
break ; |
058 |
} |
059 |
060 |
case 8 :{ |
061 |
062 |
RCC->APB2ENR |=1<<13; |
063 |
064 |
break ; |
065 |
} |
066 |
067 |
} |
068 |
} |
069 |
070 |
//捕获比较值设定函数 |
071 |
//参数说明: |
072 |
// TIM_x 为选择定时器 TIM_1为通用寄存器1又一次类推(定义于tim.h) |
073 |
// CCR_x 为选择捕获/比较寄存器(1~4)(定义于tim.h) |
074 |
// val 为要设定的捕获/比较寄存器的值 |
075 |
// 待完善,目前只支持TIM2 |
076 |
077 |
void Tim_CCR_Set(u8 TIM_x,u8 CCR_x,u32 val) |
078 |
{ |
079 |
switch (TIM_x) |
080 |
{ |
081 |
case 1 :{ |
082 |
break ; |
083 |
} |
084 |
085 |
case 2 :{ |
086 |
087 |
TIM2->DIER |= 1 << CCR_x; //开启相应允许捕获/比较中断 |
088 |
089 |
switch (CCR_x){ |
090 |
091 |
case 1: { |
092 |
TIM2 ->CCR1 = val; //设置捕获/比较1的值 |
093 |
break ; |
094 |
} |
095 |
096 |
case 2: { |
097 |
TIM2 ->CCR2 = val; //设置捕获/比较2的值 |
098 |
break ; |
099 |
} |
100 |
101 |
case 3: { |
102 |
TIM2 ->CCR3 = val; //设置捕获/比较3的值 |
103 |
break ; |
104 |
} |
105 |
106 |
case 4: { |
107 |
TIM2 ->CCR4 = val; //设置捕获/比较4的值 |
108 |
break ; |
109 |
} |
110 |
} |
111 |
|
112 |
break ; |
113 |
} |
114 |
115 |
case 3 :{ |
116 |
break ; |
117 |
} |
118 |
case 4 :{ |
119 |
break ; |