STM32F407 纯寄存器操作定时器,PWM,ADC(专治花里胡哨)

2019-08-23来源: eefocus关键字:STM32F407  寄存器操  定时器  PWM  ADC

定时器

在这里插入图片描述

真多啊,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

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472341.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F0造就盖亚智能城市崛起

翻译自——ST blog 在2019年9月25日至27日的电子印度(electronica India)展上,来自印度初创企业盖亚智能城市(Gaia Smart Cities)的智能反馈投票系统将成为我们在大诺伊达(Greater Noida)的合作伙伴演示之一。盖亚在33个机场和100多个城市部署了大约4000个智能反馈系统。甚至印度政府也把它作为Swachh Bharat使命的一部分,这是一个旨在改善社区和基础设施清洁的全国性运动。总而言之,这家初创公司已经处理了超过7500万条回复。 机器本身使用STM32F0来收集人们的反馈。用户在体验了一个公共场所的清洁、排队、服务、美食广场、客户服务等之后
发表于 2019-09-23
STM32F0造就盖亚智能城市崛起

STM32中stm32f0xx_flash.icf文件的作用详解!

 添加额外的region   比如我要添加另一个名为ROM2的ROM区域,大小是256bytes,起始地址是0x80000.       define region ROM = Mem:[from 0x80000 size 0x100];2.2 教你怎样放置SECTION如果你要把你的只读常量放置在你指定的域而不是编译器默认的位置,你就得按如下操作了:define region CONST_region = Mem:[from 0x100 size 0x100];place in
发表于 2019-09-21
STM32中stm32f0xx_flash.icf文件的作用详解!

基于stm32f103zet6的DS1302学习

由于硬件出了问题,也就是外部低速晶振没用,震不起来,然后查看了网上的帖子,STM32的RTC果然口碑不怎么样,所以果断换DS1302,在移植的过程中还算顺利,记录下来吧,也算对自己的总结吧!1、所谓的DS1302这里面也指明了简单的SPI协议然后就直接上代码了,注释很详细的!基本实现单行注释1、主函数main#include "stm32f10x.h"      #include "SysTick.h"  #include "Delay.h"  
发表于 2019-09-21
基于stm32f103zet6的DS1302学习

第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》以及《Proprietary code read-out protection on microcontrollers》。51.1 选项字节与读写保护在实际发布的产品中,在STM32芯片的内部FLASH存储了控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂商即可利用该代码文件山寨产品。为此,STM32芯片提供了多种方式保护内部FLASH的程序不被非法读取,但在默认情况下该保护功能
发表于 2019-09-20
第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列

第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于开发板配套的OV2640摄像头参数可查阅《ov2640datasheet》配套资料获知。STM32F4芯片具有浮点运算单元,适合对图像信息使用DSP进行基本的图像处理,其处理速度比传统的8、16位机快得多,而且它还具有与摄像头通讯的专用DCMI接口,所以使用它驱动摄像头采集图像信息并进行基本的加工处理非常适合。本章讲解如何使用STM32驱动OV2640型号的摄像头。45.1 摄像头简介在各类信息中,图像含有最丰富的信息,作为机器视觉领域的核心部件,摄像头被广泛地应用在
发表于 2019-09-20
第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

第43章 RTC—实时时钟—零死角玩转STM32-F429系列

函数对每个外设都建立了一个初始化结构体,比如RTC_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如RTC_Init()调用,这些配置好的参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如。初始化结构体定义在stm32f4xx_rtc.h头文件中,初始化库函数定义在stm32f4xx_rtc.c文件中,编程时我们可以结合这两个文件内注释使用。RTC初始化结构体用来设置RTC小时的格式和RTC_CLK的分频系数。代码 431 RTC初始化结构体1 typedef st
发表于 2019-09-20
第43章 RTC—实时时钟—零死角玩转STM32-F429系列

小广播

何立民专栏

单片机及嵌入式宝典

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

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