历史上的今天

今天是: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方式

推荐阅读

9月5日,由全球领先的汽车电子及人工智能物联网芯片公司恩智浦半导体(NASDAQ:NXPI)主办的“2018恩智浦未来科技峰会”在深圳隆重召开,本次峰会为期两天,以“智联中国 创领未来”为主题。邀请了来自AI-IoT、汽车电子等领域的商业领袖、技术专家和从业者到场。此外,更有来自百度、阿里巴巴、吉利汽车、京东、小米等企业代表出席峰会,与恩智浦一起探讨...
STM32八路ADC采用DMA方式采集的数据如下 程序打包地址 有DMA方式和非DMA 方式https://download.csdn.net/download/qq_36958104/11352188#include "adc.h"#include "sys.h"#define ADC1_DR_Address ((u32)0x4001244C) __IO u16 ADC_ConvertedValue; /*配置采样通道端口 使能GPIO时钟 设置ADC采样PA0端口信号*/ void ADC1_GPIO_Config(vo...
概要.HEX文件是MPLAB生成的一种可执行文件的格式,它本身是由ASCII字符组成的,但其包含16进制的可执行代码的信息,也就是说,这类文件描述在程序存储器的哪个单元放入什么指令。.HEX文件的种类MPLAB可以生成3种不同格式的可执行文件。其中两种是.HEX文件,它们分别称为INHX8M格式(Intel Hex Format)和INHX32格式(Intel Hex 32 Format);另外一种...
此刻示波器屏幕上呈现的是某一LIN协议的触发波形,我们想把该波形存储起来,该如何操作呢?ZDS2022示波器充分站在用户角度,设计了一键存储的功能,而且,ZDS2022同样支持波形导入的功能。按下【Save/Recall】键,选择存储软键,在存储类型中选择保存的图片格式,存储类型包含7种格式,选择PNG图像,存储路径可选本地闪存,也可以在示波器面板上的USB口插...

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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