历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | STM32F1系列之常用外设说明

发布者:幸福之舞 来源: eefocus关键字:STM32F1系列  常用外设  RCC 手机看文章 扫描二维码
随时随地手机看文章

1、RCC相关:

 

 

APB2启动时钟项:

 

RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,

 

               RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,

 

               RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,

 

               RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,

 

               RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,

 

               RCC_APB2Periph_ALL

 

 

 

APB2启动函数:  

 

RCC_APB2PeriphClockCmd(XX,ENABLE);

 

 

 

APB1启动时钟项:

 

RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,

 

                      RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,

 

                      RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,

 

                     RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,

 

                      RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,

 

                      RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,

 

                     RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL

 

 

 

APB1启动函数:  

 

RCC_APB2PeriphClockCmd(XX,ENABLE);

 

 

 

AHB启动时钟项:

 

RCC_AHBPeriph_DMA1

 

RCC_AHBPeriph_DMA2

 

RCC_AHBPeriph_SRAM

 

RCC_AHBPeriph_FLITF

 

RCC_AHBPeriph_CRC

 

RCC_AHBPeriph_FSMC

 

RCC_AHBPeriph_SDIO

 

 

 

AHB启动函数:    

 

RCC_AHBPeriphClockCmd (XX,ENABLE);

 

 

 

 

2、GPIO相关:

GPIO模式:

 

GPIO_Mode_AIN:模拟输入                                      GPIO_Mode_IN_FLOATING:浮空输入

 

         GPIO_Mode_IPD:下拉输入                                GPIO_Mode_IPU:上拉输入

 

        GPIO_Mode_Out_OD:开漏输出                    GPIO_Mode_Out_PP:推挽输出

 

         GPIO_Mode_AF_OD:复用开漏输出             GPIO_Mode_AF_PP:复用推挽输出

 

 

 

GPIO速度:

 

GPIO_Speed_2MHz

 

GPIO_Speed_10MHz

 

GPIO_Speed_50MHz

 

 

 

GPIO引脚声明:

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;                   x:1~15或者all

 

 

 

GPIO初始化函数:

 

GPIO_Init(GPIOx, &GPIO_InitStructure);                           x:A~G

 

 

 

 

 

注:需要定义GPIO结构体变量,GPIO_InitTypeDef  GPIO_InitStructure;

 

3、PWM相关

 

#include "timer.h"

#include "led.h"

#include "usart.h"

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK战舰STM32开发板

//定时器 驱动代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2012/9/4

//版本:V1.1

//版权所有,盗版必究。

//Copyright(C) 广州市星翼电子科技有限公司 2009-2019

//All rights reserved   

//********************************************************************************

//V1.1 20120904

//1,增加TIM3_PWM_Init函数。

//2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽   

//////////////////////////////////////////////////////////////////////////////////  

      

//通用定时器3中断初始化

//这里时钟选择为APB1的2倍,而APB1为36M

//arr:自动重装值。

//psc:时钟预分频数

//这里使用的是定时器3!

void TIM3_Int_Init(u16 arr,u16 psc)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

 

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

 

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

 

TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设

 

}

//定时器3中断服务程序

void TIM3_IRQHandler(void)   //TIM3中断

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 

{

TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 

LED1=!LED1;

}

}

 

//TIM4 PWM部分初始化 

//PWM输出初始化  PB6  没有映射

//arr:自动重装值

//psc:时钟预分频数

void TIM4_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟

  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射  TIM4_CH1->PB6 没有映射

 

   //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6  没有映射  重映射的端口remap 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO  PB.6 

//GPIO_SetBits(GPIOB,GPIO_Pin_6); //PB.6 输出高

   //初始化TIM4

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM2 Channel2 PWM模式  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High  接高电平极性为高  接低电平输出极性为低TIM_OCPolarity_Low

TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 CH1 TIM_OC1PreloadConfig

//    CH1的PWM脉冲波形

 

TIM_CtrlPWMOutputs(TIM4,ENABLE); //⑤MOE 主输出使能   非高级定时器可省略

TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器  TIM4 CH1

TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器  非高级定时器可省略

TIM_Cmd(TIM4, ENABLE);  //使能TIM4

 

}

 

 

//TIM3 PWM部分初始化 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM3_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   PC7

 

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5  重映射的端口remap

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOC.7  重映射的端口remap

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM3 Channel2 PWM模式  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

 

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

 

TIM_Cmd(TIM3, ENABLE);  //使能TIM3

 

}

 

//TIM2 PWM部分初始化 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM2_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟

[1] [2] [3] [4]
关键字:STM32F1系列  常用外设  RCC 引用地址:STM32F1系列之常用外设说明

上一篇:STM32 多个定时器 多路PWM配置
下一篇:STM32八路ADC采用DMA方式

推荐阅读

中国领先的医疗器械生产与制造技术展览会2018Medtec中国展,将于9月26-28日升级亮相上海世博展览馆。2018 Medtec中国展是Medtech World全球系列展览会在中国举办的第十四年,展会规模为历届之最,整体面积较17年增长了25%。今年现场将汇聚医疗设计和研发、原材料、精密配件、加工技术、法规咨询及生产制造服务等领域的400多个优质品牌参展,其中逾 100...
实验过程中的笔记 在持续更新中 只是一个简化版本利用定时器1 2 3 4 配置的PWM输出 PWM输出注意外部接入的高电平还是低电平 注意修改 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low //定时器3 ,输出T...
之前曾有消息称华为要在IFA2020大会上发布麒麟9000处理器,现在来看他们并没有这么做。9月3日晚间消息,华为在2020IFA举行了主题为“对欧洲的愿景和承诺”的演讲活动,华为消费者业务集团欧洲区总裁沃尔特·吉在活动上宣布,由华为开发的应用程序商店App Gallery在欧洲拥有3300万用户。华为目前拥有超过800多个合作伙伴,产品品类超过100个。沃尔特·吉说...
AccelerComm宣布基于Silicom N5010平台的符合5G O-RAN标准的基站加速器将符合O-RAN标准的第1层加速器和服务器平台相结合,可创建解决方案,使用更少的资源和功耗显着提高5g性能英国南安普敦–2021年9月6日:AccelerComm公司通过物理层IP为5G提供增压,提高频谱效率并减少延迟,今天宣布它已经创建了一个7.2x5G O-RAN符合标准的 该项目是为一家5G网络基...

史海拾趣

问答坊 | AI 解惑

国内外IC设计公司创业模式比较

[]偶看到这篇分析,感觉不错,希望分享[Y]在半导体行业有工作经验的人对半导体产业的周期性波动特点不会陌生,尽管人们对 刚刚经历了2001年坐滑梯的感觉还心存余悸,但从政府到公司甚至个人职业生涯的选 择,人们对半导体产业的热情丝毫未减,期待着寒冬 ...…

查看全部问答∨

PLC工程师招聘

本公司位于南京江宁区 现招聘3名PLC工程师 岗位要求: 1) 专科以上学历,从事PLC软件开发业务一年以上; 2) 较强的动手能力和独立解决问题能力; 3) 有图像处理、机器视觉检测相关的工作经验者优先; 4) 根据自愿原则PLC能力较好者可派遣 ...…

查看全部问答∨

单片机如何采集内部产生的方波信号?

小弟在做一个试验,就是从单片机内部引脚产生一个占空比可调 频率可调的方波,然后进入AD,AD转换后在通过本身单片机实现在液晶显示转换结果, 现在我是分别做的这两部分:1.从外部输入一个方波信号,能实时液晶显示转换结果      ...…

查看全部问答∨

关于arm8962的蜂鸣器的问题

我使用easyarm8962做了一个使用蜂鸣器奏乐的实验。我用的下面的方法来使蜂鸣器发出特定频率的声音,蜂鸣器发出了声音,但却没有声调的变化(我已经定义好了一个乐谱,音符就是用不同的频率表示): //  蜂鸣器发出指定频率的声音 //&nb ...…

查看全部问答∨

如何设置默认播放器

谁知道在win ce中如何设置默认播放器呀!!!我不想用mediaplayer. 最好是改注册表的,因为我要实现永久性修改,如果能不用注册表实现更好.对了.谁知道怎么用mediaplayer播放视频呀,我的只能听mp3....如果能放视频的话 我就不用改默认播放器了…

查看全部问答∨

有谁在VS2005下开发sm5.0数据库为sqlite

有谁在VS2005下开发sm5.0数据库为sqlite,给发一个示例,8844.4321@163.com…

查看全部问答∨

有用C8051F06x系列单片机做AD转换的吗?

请问各位: 以前都是用89c51单片机,c8051f06X单片机我刚开始学,很多问题不大明白,我想用DMA直接将数据送到外部XARM,而且是多通道的,总共有36个通道,但是现在ADC初始化和DMA初始化部分我比较混乱.有用过的大侠请给我讲下,要是有程序片段那就更好了 ...…

查看全部问答∨

今年消费MEMS预计增长37% 再创最高增速

据IHS公司的消费与移动MEMS市场研究报告,微机电系统(MEMS)市场中最大和最有活力的领域是消费与移动器件,通过积极开拓智能手机和平板应用,2011年MEMS市场将再度实现创纪录的增长率。 2011年消费与移动MEMS营业收入将达到22.5亿美元,取得迄 ...…

查看全部问答∨

dsp考试题??

我们DSP考试题目是 F2812中SCI通信 LSPCLK设置为40M,要使波特率为9600 则BRR高低位值为 A,0X23,0X0F B,0X0F,0X23 C,0X12,0X0F D,0X23,0X12 我计算出来没有答案啊,问老师,老师说题目没错,求真相…

查看全部问答∨

TI 电源开关设计秘笈30 例(共3个PDF)

电源设计一直是工程师面对的一个难题,随着全球节能环保意识的提升,设计简捷、高效、轻巧的绿色电源成为工程师的首要任务,为了帮助工程师解决这方面的难题,现在特别隆重推出大量实用资料供工程师朋友下载,目前推出的一本电子书叫做《电源开关设 ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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