寄存器配置stm32设备
1、使能外设的时钟:APB1ENR,APB2ENR
2、配置寄存器或者说是控制寄存器。在配置stm32外设时,任何时候都要先使能该外设的时钟!而每个控制寄存器,很有可能包括了,1模式寄存器,2使能寄存器,3才可能是我们认为的数据寄存器或者内容寄存器。
3、使能外设。即使配置好了,没有使能外设,则外设永远不会工作,这一点比较容易遗忘。
寄存器配置,请查看
http://wenku.baidu.com/link?url=NE4LMJFepztwPxYEb0n72SMNZLTruz32JsEJNPAtcV9AcS9OpA6CoLrJGllXzW5relKtY2c8MBKWURnBdYZG_sNj7yg_JFo7cpdut4k1mzS
由于stm32的很多引脚都是复用,所以在配置寄存器配置时,必须设置为复用,复用切记是默认的复用功能为主,参考文档,请查看
http://download.csdn.net/detail/bolvtin/8867933
1、外设时钟寄存器
RCC_APB1ENR(APB1外设时钟使能寄存器)
RCC_APB2ENR(APB2外设时钟使能寄存器)
RCC_APB2RSTR(APB2外设复位寄存器)
RCC_APB1RSTR(APB1外设复位寄存器)
外设使能寄存器与外设复位寄存器存在着对应关系,相应位置对应相应外设的时钟使能与复位。
注意以下几个外设
1,GPIO--GPIOA,GPIOB, GPIOC,GPIOD,GPIOE,GPIOF,GPIOG时钟都在RCC_APB2ENR寄存器
2,串口--USART1时钟都在RCC_APB2ENR寄存器
3,定时器—TIM1,TIM8时钟都在RCC_APB2ENR寄存器
1,串口—USART2,USART3,USART4,USART5时钟都在RCC_APB1ENR寄存器
2,定时器—TIM2,TIM3,TIM4,TIM5,TIM6,TIM7时钟都在RCC_APB1ENR寄存器,TIM2- TIM5可以产生PWM
注意一下定时器的内部时钟信号来源
当APB1的时钟分频数设置为1,通用定时器的时钟就是APB1的时钟;当APB1的时钟分频数设置为2,通用定时器TIMx的时钟是APB1的2倍,即72Mhz。高级定时器1,8的时钟来自于APB2,不是APB1。
2、以PWM波为例进行说明
1,定时器2-5可以产生PWM波
timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void Timerx_Init(u16 arr,u16 psc);
void PWM_Init(u16 arr,u16 psc);
#endif
timer.c
#include "timer.h"
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X00000004;//浮空输入
/*********************serial code***************************************************************/
GPIOA->CRL&=0X0FFFFFFF;//PA7输出
GPIOA->CRL|=0XB0000000;//复用功能输出
GPIOA->ODR|=1<<7;//PA7上拉
TIM3->ARR=arr;//设定计数器自动重装值
TIM3->PSC=psc;//预分频器不分频
//TIM3->CCMR1|=7<<12; //CH2 PWM2模式 这个作用在板子上的灯DS0可以显示PWM波
TIM3->CCMR1|=6<<12; //CH2 PWM2模式 与上面极性相反
TIM3->CCMR1|=1<<11; //CH2预装载使能
TIM3->CCER|=1<<4; //OC2 输出使能
TIM3->CR1=0x8000; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
/*********************通用定时器4 1通道(PB6)和2通道(PB7)的配置***************************************************************/
RCC->APB1ENR|=1<<2; //TIM4时钟使能
RCC->APB2ENR|=1<<3;//这里必须有这一个GPIO口的使能,GPIOA已经在led.c中定义过了,可是GPIO 的B口还没有
GPIOB->CRL&=0X00FFFFFF;//PB7 PB6输出
GPIOB->CRL|=0XBB000000;//复用功能输出 PB7的 TIM4的默认复用功能 为PWM波
GPIOB->ODR|=1<<7;//PB7上拉
GPIOB->ODR|=1<<6;//PB6上拉
TIM4->ARR=arr;//设定计数器自动重装值
TIM4->PSC=psc;//预分频器不分频
//TIM4->CCMR1|=7<<12; //
TIM4->CCMR1|=6<<4; //CH1 PWM2模式
TIM4->CCMR1|=6<<12; //CH2 PWM2模式
TIM4->CCMR1|=1<<3; //通道1预装载使能 是PB6口
TIM4->CCMR1|=1<<11; //CH2预装载使能
TIM4->CCER|=1<<0; //通道1 输出使能
TIM4->CCER|=1<<4; //OC2 输出使能
TIM4->CR1=0x8000; //ARPE使能
TIM4->CR1|=0x01; //使能定时器4
}
pwm.c
#include
#include "sys.h"
#include "usart.h"
#include "timer.h"
void tim3PWM(int changeAngle)//俯仰舵机
{
//PWM_Init(14400,100)定义了14400 对应20毫秒,720对应1毫秒,360对应0.5毫秒,电机的控制是0.5-2.5毫秒之间,1.5代表中位
TIM3->CCR2 = changeAngle; //现在TIM3的2通道 TIM4的1通道 都可以用了 只需要改变这句 以及main函数中的//TIM4->CCR1 = 1080;即可
//TIM4->CCR1 = changeAngle;
//delay_ms(20);
}
void tim4PWM(int changeAngle)
{
//TIM4->CCR1 = changeAngle; 不知道为什么总是出现1.5到2ms 再从2到1.5毫秒 跳变 貌似时钟不一样 改为tim4的2通道
TIM4->CCR2 = changeAngle; //这个2通道 PB7口
//delay_ms(20); //根究DS0灯的PWM显示,貌似这里是不需要等待20毫秒的
}
int main(void)
{
/************************接收串口数据后,再发回,显示******
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化 串口1 串口2-5的时间晶振是不一样的 小一半
PWM_Init(14400,99); //PWM频率是50hz 20ms对应的是14400 1ms对应720 TIM3_CH2->PA7 TIM4_CH2->PB7
/************每次运行程序都进行中位初始化*************************/
TIM3->CCR2 = 1080; //1.5毫秒 中位 90度
TIM4->CCR1 = 1080; //1.5毫秒 中位 90度
}
上一篇:STM32F103的时钟配置源码学习记录
下一篇:基于STM32F4的舵机控制
推荐阅读最新更新时间:2024-03-16 16:05