OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8299|回复: 6

定时器开了之后关不了,求大神解答

[复制链接]

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
发表于 2014-4-14 22:13:41 | 显示全部楼层 |阅读模式
如题。定时器1为主定时器,2 3 4为从定时器。
void MYTIM_Init(u16 arr,u16 psc)
{
  RCC->APB2ENR|=1<<11;       //TIM1时钟使能
RCC->APB2ENR|=0x03<<2;     //PA PB使能 PD
      GPIOA->CRH&=0XFFFFFFF0;//PA8  输出
    GPIOA->CRH|=0X0000000B;//复用功能输出
 
GPIOA->CRL&=0X0FFF00FF;//PA2 3  7  输出
    GPIOA->CRL|=0XB000BB00;//复用功能输出

GPIOB->CRH&=0XFFFFFF0F;//PB9 输出
    GPIOB->CRH|=0X000000B0;//复用功能输出

GPIOC->CRH&=0XFFF0FFFF;//PC12 输出
    GPIOC->CRH|=0X00030000;//推挽输出
GPIOC->ODR|=1<<12;      //PD.2输出高
   
        
    TIM1->BDTR|=0xC0;   //ARPE使能 
      TIM1->ARR=arr;//设定计数器自动重装值 
    TIM1->SC=psc;//预分频器不分频
     
    TIM1->CCMR1=0x0078;   // CH1 PWM7模式, ARR预装载使能        
  TIM1->CCER|=1<<0;   //OC1 输出使能  
    TIM1->CCR1=arr/2;
TIM1->CR2=0x0040; 
TIM1->CCER|=1<<5;   // 低电平有效
    TIM1->CR1 |=0x80;   //ARPE使能 
    TIM1->BDTR|=0x8000;  //使能定时器1输出

            RCC->APB1ENR|=1<<1;     // TIM3时钟使能    
TIM3->ARR=40000; // 设定计数器自动重装值, 是4个MCLK时钟
TIM3->SC=0; // 预分频器????
TIM3->SMCR=0x0007; // Timer1的OC1的更新事件来触发 
TIM3->DIER|=0X01; //允许触发中断
  MY_NVIC_Init(2,2,TIM3_IRQChannel,2);//抢占2,子优先级2,组2

RCC->APB1ENR|=1<<0;     // TIM2时钟使能    
TIM2->ARR=40000; // 设定计数器自动重装值, 是4个MCLK时钟
TIM2->SC=1; // 预分频器????
TIM2->CCMR2=0x6868;   // CH3,CH4,PWM6模式, 预装载使能
TIM2->SMCR=0x0007; // Timer1的OC1的更新事件来触发
TIM2->CCER|=3<<8;
TIM2->CCER|=1<<12;   // OC3 高电平有效 PA2   ICG       OC4 输出使能   高电平有效  A3   SH
TIM2->CCR3=200; // 比较寄存器为值1
TIM2->CCR4=100; // 比较寄存器为值1
TIM2->CR1=0x0080;   // ARPE使能

RCC->APB1ENR|=1<<2;     // TIM2时钟使能    
TIM4->ARR=3; // 设定计数器自动重装值, 是4个MCLK时钟
TIM4->SC=psc; // 预分频器????
TIM4->CCMR2=0x6800;   // CH2,PWM6模式, 预装载使能
TIM4->SMCR=0x0007; // Timer1的OC1的更新事件来触发
TIM4->CCER|=1<<12;   // OC2 输出使能   
TIM4->CCR4=2; // 比较寄存器为值1, 占空比1:3
TIM4->CR1=0x0080;   // ARPE使能
}

void start(void)
{
TIM1->CR1|=0x01;    //使能定时器1
TIM2->CR1|=0x01;     // 使能定时器2
TIM4->CR1|=0x01;     // 使能定时器4
}

int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
MYTIM_Init(32,0);
start();
while(1)
{
start();
PCout(12)=!PCout(12);
delay_ms(1000);
    TIM1->CR1&=~(0x01);     // 停止MCLK时钟
        TIM2->CR1&=~(0x01);     // 停止SH ICG
        TIM4->CR1&=~(0x01);     // 停止AD触发 
delay_ms(1000);
}
}
示波器上完全看不到1000ms的延时。求解什么情况?


定时器的Timer_CR1寄存器的0位是这样写的,不知道各位大神们怎么理解?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-14 22:23:20 | 显示全部楼层
写0可以关闭。
你示波器看到的是什么效果?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
 楼主| 发表于 2014-4-15 08:49:04 | 显示全部楼层
原子哥,是这样的,每个近40ms一个低电平,这个很有规律,看不到1000ms的暂停。

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-15 20:01:13 | 显示全部楼层
delay_ms,貌似没看到你初始化delay,不知道是不是这个问题引起的。
也就是你的delay运行不正常。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
 楼主| 发表于 2014-4-16 16:40:29 | 显示全部楼层
回复【4楼】正点原子:
---------------------------
是这个问题,解决了,谢谢原子哥。
又遇到个问题,定时器1为主触发定时器2。
void Timer1234_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11;       //TIM1时钟使能       
TIM1->BDTR|=0xC0;   //ARPE使能 
TIM1->ARR=arr;//设定计数器自动重装值 
TIM1->SC=psc;//预分频器不分频     
TIM1->CCMR1=0x0078;   // CH1 WM7模式, ARR预装载使能        
TIM1->CCER|=1<<0;   //OC1 输出使能  
TIM1->CCR1=arr/2;
TIM1->CR2=0x0040; 
TIM1->CR1|=0x0080;   //ARPE使能
TIM1->CR1&=~(1<<1);  //UDIS位禁止UEV(更新事件),不进入中断函数     
TIM1->BDTR|=0x8000;  //使能定时器1输出
 
RCC->APB1ENR|=1<<0;     // TIM2时钟使能    
TIM2->ARR=40000; // 设定计数器自动重装值
TIM2->SC=0; // 预分频器????
TIM2->CCMR2=0x0068;   // CH3PWM6模式, 预装载使能
TIM2->SMCR=0x0007; // Timer1的OC1的更新事件来触发
TIM2->CCER|=3<<8; // OC3 高电平有效 A2   ICG
TIM2->CCR3=200;   // 比较寄存器为值1
TIM2->CR1=0x0080;    // ARPE使能
}
我需要在定时器2输出端口PA2的上升沿有个动作,TIMx_CNT的值与TIMx_CCR1的值匹配时TIMx_SR置1。用Keil MDK软件仿真的时候的确是这样,但是用硬件J-link仿真,
对TIMx_SR的操作完全没有作用,定时器一开,TIMx_SR就等于0x005F了,并且TIM2->SR&=~(0x0008);或者TIM2->SR&=0xFFF6;TIM2->SR=0x0000;都不能改变TIM2->SR的值,数据手册上说的是TIM2->SR的这些位  软件 清0,为什么会不行呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-16 23:30:48 | 显示全部楼层
回复【5楼】BULELJ:
---------------------------------
这个问题我也无解,你只能在中断服务函数判断SR,的对应位,然后再清零。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
 楼主| 发表于 2014-4-17 10:09:25 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
这个太难以理解了,清零以后,就算执行一条__nop()语句,TIM2->SR立马变成0x005f,但是软件仿真就不出这事!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 23:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表