定时器

在这里插入图片描述

真多啊,14个定时器,三种。


通用定时器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

注意:


需要手动清除中断标志

在这里插入图片描述
在这里插入图片描述


TIM3->ARR = 5000-1; //自动重载寄存器,10Khz 的计数频率,计数 5K 次为 500ms

TIM3->PSC = 8400-1; //预分频器

两个寄存器的计算

PSC预分频器

//这里时钟选择为 APB1 的 2 倍,而 APB1 为 42M,所以TIM3的时钟频率为84M

在这里插入图片描述

PSC=8400

f=84M/8400=10000Hz=10KHz

t=1/f=0.1ms

每次技术时间0.1ms

ARR=5000-1; //自动重载寄存器

计数5000次,共500ms

//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.

//Ft=定时器工作频率,单位:Mhz


完整代码


#include  

#include

#include


int main()

{

  Stm32_Clock_Init(336,8,2,7); //系统时钟

delay_init(48);

SCB->AIRCR = 0x05FA0000 | 0x500;

NVIC->IP[29] = 0x50; //最低抢占优先级,最低响应优先级01 01  EXTI2中断

  NVIC->ISER[0] |= (1<<29); //使能中断线29,也就是EXTI2中断

  

  RCC->AHB1ENR |= 0x00000020; //使能GPIOF时钟

RCC->APB1ENR |= 1<<1;

  

  GPIOF->MODER &= 0x00000000; //设置F9,F10  0001 0100 0000 0000 0000 0000

  GPIOF->MODER |= 0x00140000; 

  

  GPIOF->OTYPER &= 0x00000600; //设置F9,F10推挽输出

  

  GPIOF->OSPEEDR &= 0x00000000; //F9,F10 速度50m 0010 1000 0000 0000 0000 0000

  GPIOF->OSPEEDR |= 0x00280000;


TIM3->ARR = 5000-1;  //10Khz 的计数频率,计数 5K 次为 500ms

TIM3->PSC = 8400-1;

TIM3->DIER |=1<<0;

TIM3->CR1 |= 1<<0;


while(1)

{

GPIOF->BSRRL = 0x0200; //0000 0000 0010;

GPIOF->BSRRL = 0x0400; 

}

}


void TIM3_IRQHandler()

{

if(TIM3->SR&0X0001)//溢出中断

{

GPIOF->BSRRH = 0x0200; //0000 0000 0010

GPIOF->BSRRH = 0x0400; 

delay_ms(1000);

 

TIM3->SR&=~(1<<0);//清除中断标志位


}


PWM

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#include  

#include

#include


int main()

{

u16 dir;

u16 led0pwmval;

  Stm32_Clock_Init(336,8,2,7); //系统时钟

delay_init(48);

 

RCC->APB1ENR|=1<<8; //TIM14 时钟使能

RCC->AHB1ENR|=1<<5; //使能 PORTF 时钟

GPIO_Set(GPIOF,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,

GPIO_PUPD_PU);//复用功能,上拉输出

GPIO_AF_Set(GPIOF,9,9); //PF9,AF9

TIM14->ARR=500-1; //设定计数器自动重装值

TIM14->PSC=84-1; //预分频器不分频

TIM14->CCMR1|=6<<4; //CH1 PWM1 模式

TIM14->CCMR1|=1<<3; //CH1 预装载使能

TIM14->CCER|=1<<0; //OC1 输出使能 

TIM14->CCER|=1<<1; //OC1 低电平有效

TIM14->CR1|=1<<7; //ARPE 使能

TIM14->CR1|=1<<0; //使能定时器 14

while(1)

{

  delay_ms(10);  

if(dir)led0pwmval++;

else led0pwmval--;  

  if(led0pwmval>300)dir=0;

if(led0pwmval==0)dir=1;      

TIM14->CCR1 =led0pwmval;  

}

}


ADC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include  

#include

#include

#include


void Adc_Init(void); //ADC 初始化

u16 Get_Adc(u8 ch); //获得某个通道值

u16 Get_Adc_Average(u8 ch,u8 times);//得到某个通道给定次数采样的平均值


int main()

{

u16 adcx;

float temp;

  Stm32_Clock_Init(336,8,2,7); //系统时钟

delay_init(168);

uart_init(84,115200);


Adc_Init(); //初始化 ADC

while(1)

{


adcx=Get_Adc_Average(5,20);

temp=(float)adcx*(3.3/4096);

adcx=temp;  //整数

printf("%d.",adcx);

temp-=adcx; //小数

temp*=1000;

printf("%dVn",(u16)temp);

delay_ms(1000);

}


}



//初始化 ADC

//这里我们仅以规则通道为例

//我们默认仅开启 ADC1_CH5 

void Adc_Init(void)

{

//先初始化 IO 口

RCC->APB2ENR|=1<<8; //使能 ADC1 时钟

RCC->AHB1ENR|=1<<0; //使能 PORTA 时钟 

GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PA5,模拟输入,下拉

RCC->APB2RSTR|=1<<8; //ADCs 复位

RCC->APB2RSTR&=~(1<<8);  //复位结束 

ADC->CCR=3<<16;  //ADCCLK=PCLK2/4=84/4=21Mhz,ADC 时钟不要超过 36Mhz

ADC1->CR1=0; //CR1 设置清零

ADC1->CR2=0; //CR2 设置清零

ADC1->CR1|=0<<24; //12 位模式

ADC1->CR1|=0<<8; //非扫描模式

ADC1->CR2&=~(1<<1); //单次转换模式

ADC1->CR2&=~(1<<11); //右对齐

ADC1->CR2|=0<<28; //软件触发

ADC1->SQR1&=~(0XF<<20);

ADC1->SQR1|=0<<20; //1 个转换在规则序列中 也就是只转换规则序列 1

//设置通道 5 的采样时间

ADC1->SMPR2&=~(7<<(3*5)); //通道 5 采样时间清空

ADC1->SMPR2|=7<<(3*5); //通道 5 480 个周期,提高采样时间可以提高精确度

ADC1->CR2|=1<<0;  //开启 AD 转换器


//获得 ADC 值

//ch:通道值 0~16

//返回值:转换结果

u16 Get_Adc(u8 ch)

{

ADC1->SQR3&=0XFFFFFFE0;//规则序列 1 通道 ch

ADC1->SQR3|=ch;  //ch:通道值 0~16

ADC1->CR2|=1<<30; //启动规则转换通道

while(!(ADC1->SR&1<<1));//等待转换结束 

return ADC1->DR; //返回 adc 值 

}


//获取通道 ch 的转换值,取 times 次,然后平均

//ch:通道编号

//times:获取次数

//返回值:通道 ch 的 times 次转换结果平均值

u16 Get_Adc_Average(u8 ch,u8 times)

{

u32 temp_val=0;

u8 t;

for(t=0;t {

temp_val+=Get_Adc(ch);

delay_ms(5);

}

return temp_val/times;

}


关键字:STM32F407  寄存器操  定时器  PWM  ADC 引用地址:STM32F407 纯寄存器操作定时器,PWM,ADC(专治花里胡哨)

上一篇:STM32F4 软件模拟IIC
下一篇:STM32F407 纯寄存器操作GPIO,串口,中断(专治花里胡哨)

推荐阅读

以互联网、、人工智能为代表的新技术,与制造业加速融合,促进了智能制造的发展。随着机器人和人工智能技术的突破,我们迎来了一个全新的时代,机器人是当前科技变革最重要的领域之一,机器人技术正在推动各个行业的转型升级。在人工智能技术的助力下,机器人从简单的自动化转变为高度智能化,其应用场景从工业到医疗、商业场所、家庭服务等不断扩展,同...
三星电子秋季旗舰机Galaxy Note10已在韩国正式开卖,预购量更突破历代纪录达130万台,外界期待,该手机于23日上市全球后,销量有望突破1000万台。据韩媒《首尔经济》报道,三星电子计划在美加地区、欧洲、东南亚、澳洲等70多国推出Galaxy Note10,9月初会增加至130多国。值得注意的是,Galaxy Note10在韩国预购期间,创下Galaxy S与Note系列中最高纪录...
美国政府还在积极推动美国公司收购TikTok,微软无疑是最有可能的买家,但不是唯一感兴趣的。据外媒报道,美国科技巨头甲骨文(Oracle)将会参与竞购TikTok,目前正在认真考虑收购TikTok在美国、加拿大、澳大利亚、新西兰的业务,并且已经和TikTok母公司字节跳动进行初步谈判。消息人士披露,甲骨文还在与一些持有字节跳动股份的美国投资者合作,包括泛大西洋...
BootLoader一般用于后期嵌入式产品的升级使用。由于产品中缺乏jtag硬件调试接口。BootLoader可以实现没有物理破坏性的软件升级。开发重点:1、芯片本身的Flash驱动。一般都由官方提供。比如mpc5744P芯片采用的文档是Standard software driver for C55 Flash。我们可以采用vle指令的,c-array形式的驱动。该驱动的表现形式是数组。其实里面应该就是一个...

史海拾趣

问答坊 | AI 解惑

安检门原理及常见问题和维修方法

一、安检门原理由晶振产生3.5-4.95M的正弦振荡,由分频器分频为7.8K左右正弦波,经三极管与线圈进行功率放大后输入门板(7区)大线圈进行电磁波发射,由门内1-6区线圈分别进行接收。接收后,将接收到的信号与基准信号进行了比较,发现变化后,改变采 ...…

查看全部问答∨

抗反射、防眩光阳光下可视液晶显示器WEDC AMLCD

ENH064V1-300/450/600 尺寸大小: 6.4" 分辨率: VGA 640 x 480 接口: 6-bits TTL interface 亮度 : 350/450/600nit(cd/m2) 显示模式:Normally White 响应时间:Rise 30ms/ Fall 50ms 功耗:5.6/5.6/8.5W 工作温度:0℃---+55℃ 储藏温度:-25 ...…

查看全部问答∨

MQ-3酒精传感器中文资料

MQ-3酒精传感器中文资料,有需要的,可以下载了。…

查看全部问答∨

Proteus7.6完美版--破解+汉化

Proteus7.6完美版--破解+汉化 很多朋友说破解了以后不能用,我看了一下,确实如此,我又到网上搜了一下,搜到这个Proteus_7.6_SP4_0.96_,我试了一下,元件能放上去了,大家可以试一下 下面是这个破解文件,请一定按照read me 文件里的说明进行操 ...…

查看全部问答∨

探秘中国IC设计公司发展迷局(一) 

2000年到2009年十年间,中国的IC设计公司的命运跌宕起伏。十年来,始终没有一家IC公司能够在中国市场扛起旗帜,可谓是各领风骚一二年。天天谈芯 成立于1999年10月的中星微电子,除了CMOS数码图像处理芯片“星光N号”取得成功,公司依靠“星光中国 ...…

查看全部问答∨

ucosII的任务调度疑问!

    通过实验对ucos的任务调度有些疑问,希望得到你们的指点!     问题如下:     创建了两个任务:     OSTaskCreate( taskLED1,  (void *)0, &GstkLED1[TASK_LED_STK_SIZE-1],1 ); &nb ...…

查看全部问答∨

请教外部存储器件e2prom的问题

24c04可以存储512个字节,如果存满了,有没有一个返回信息? 还是什么时候存满必须程序员自己计算? 谢谢~~…

查看全部问答∨

usb键盘驱动的问题,驱动了等于没驱动,郁闷!!!!!

usb键盘的驱动按道理来说,在menuconfig选上HID就可以了 我的问题是,在/dev/下压根就没有input,还要手动mkdir /dev/input 然后,mknod /dev/input/kbd c 13 64 问题来了,这下 如果 cat /dev/input/kbd ,按键盘是可以看到信息,但是,console ...…

查看全部问答∨

急救,PCI调试中LBE#信号错误??

在调试PCI板卡时,配置空间已配置好,8位局部总线,但LBE0#,LBE1#信号持续为高,系统一读就死机,请高手帮忙,谢谢。…

查看全部问答∨

如何正确使用电位器来调节音量(续)

    当音源信号接到滑动端,有两点不妥:     1、使得音源信号的输出负载发生改变。见图,                    &n ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved