寄存器版本的STM32编程思想02

STM32寄存器版本(基于架构ARM v7 F103ZET6)

          最近用了很久的库函数版本STM32编程,后来发现其中很多原理及过程不是很理解,最终决定以寄存器版本为切入点,重新把cotex-m3系列的芯片之一进行再次深入的了解。我会根据自己的实践经验分享一些实验过程中的经验,现记录如下:

代码如下

目录如下:

实验6:独立看门狗

实验7:窗口看门狗

实验8 定时器中断

实验9:PWM实验

实验6:独立看门狗

#include "IWDG.h"

void idwg_init(u32 prer,u32 rlr)//prescaler,rlr,reload data
{
    IWDG->KR=0x5555;//enable pr and rlr register
    IWDG->PR=prer;
    IWDG->RLR=rlr;
    IWDG->KR=0xAAAA;
    IWDG->KR=0xCCCC;//start IWDG
}
void idwg_feed(void)//feed dog
{
    IWDG->KR=0xAAAA;//reload
}

实验7:窗口看门狗

(通俗解释就是只能在规定的窗口内喂狗,不然就产生复位,主要解决独立看门狗的缺点如程序跑飞又跑回,这个时候独立看门狗一般不会产生复位)

#include "WWDG.h"
#include "led.h"

u8 WWDG_CNT=0x7f;//WWDG_CR register max num

void wwdg_init(u16 w,u8 wdgtb,u8 t)//w->W[6:0],wdgtb->WDGTB,t->T[5:0]
{
    //1,enable clock
      RCC->APB1ENR|=1<<11;//enable clock
    //2,configuation CFR and CR register
      WWDG_CNT=t&WWDG_CNT;
      WWDG->CFR|=wdgtb<<7;
      WWDG->CFR&=0xFF80;
      WWDG->CFR|=w;
      WWDG->CR|=WWDG_CNT;
      WWDG->CR|=1<<7;//ENABLE WWDG
      MY_NVIC_Init(0,0,WWDG_IRQn,2);
      WWDG->SR=0x00;//clear early wakeup interrupt flag
      WWDG->CFR|=1<<9;
    
}

void WWDG_set_counter(u8 cnt)//reset counter
{
    WWDG->CR|=(cnt&0x7f);
}

void WWDG_IRQHandler(void)
{
    WWDG_set_counter(WWDG_CNT);
    WWDG->SR=0x00;//clear early wakeup interrupt flag
    LED1=!LED1;
}

实验8 定时器中断

#include "timer_inter.h"
#include "led.h"
void timeinter_init(u32 ARR,u32 psc)
{
    //ENABLE clock
    RCC->APB1ENR|=1<<1;
    //configuation TIM3
    //tout=(arr+1)*(psc+1)/Tclock;
    //system clock 72MHz,Tclock=72MHzÈôÏ붨ʱ¼ä¸ôΪ1s£¬ÒÔ10KHzΪ¼ÆÊýƵÂÊ£ºpsc=7199
    //ARR=9999
    TIM3->ARR|=ARR;
    TIM3->PSC|=psc;
    TIM3->DIER|=1<<0;//update interrupt enable
    TIM3->CR1|=1<<0;//start TIM3
    
    MY_NVIC_Init(0,0,TIM3_IRQn,2);
    
}
void TIM3_IRQHandler(void)
{
    if(TIM3->SR&(0x0001))//update interrupt flag
    {
        LED1=!LED1;
    }
    TIM3->SR&=~(1<<0);//clear update interrupt flag
}

实验9:PWM实验

//function:pwm control PB5(led0)
#include "PWM.h"
void pwm_init(u16 arr,u8 psc)
{
    //ENABLE TIM3 clock and configuating PB5 for AFIO
    RCC->APB1ENR|=1<<1;
    RCC->APB2ENR|=1<<3;//
    GPIOB->CRL&=0xFF0FFFFF;
    GPIOB->CRL|=0x00B00000;//GPIO_Mode_AF_OD.50MHz
    //confguating AFIO_MAPR regisetr,if you want to cnfiguate AFIO register
  //    you must Alternate function I/O clock enable
    RCC->APB2ENR|=1<<0;
    AFIO->MAPR&=0xFFFFF3FF;//clear tim3[11,10]
    AFIO->MAPR|=0x00000800;//remap to PB5
    //configuating ARR and PSC
    TIM3->ARR=arr;
    TIM3->PSC=psc;
    //CCMR1
    TIM3->CCMR1|=7<<12;//TIMx_CNT<TIMx_CCR1 chanel 1 invalid,PWM2
    TIM3->CCMR1|=1<<11;//Output compare 2 preload enable
    //ENABLE CH2 and ENABLE TIM3(CCER1 and CR)
    TIM3->CCER|=1<<4;
    TIM3->CR1|=1<<7;//Auto-reload preload enable
    TIM3->CR1|=1<<0;

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值