当前位置:首页 >> 信息与通信 >>

初学STM32-2


STM32 的时钟系统分析 在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL。 ①、HSI 是高速内部时钟,RC 振荡器,频率为 8MHz。 ②、HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~16MHz。 ③、LSI 是低速内部时钟,RC 振荡器,频率为 40kHz。 ④、LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。 ⑤、PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2、HSE 或者 HSE/2。倍频可选 择为 2~16 倍,但是其输出频率最大不得超过 72MHz。 其中 40kHz 的 LSI 供独立看门狗 IWDG 使用,另外它还可以被选择为实时时钟 RTC 的时 钟源。另外,实时时钟 RTC 的时钟源还可以选择 LSE,或者是 HSE 的 128 分频。RTC 的时钟 源通过 RTCSEL[1:0]来选择。 STM32 中有一个全速功能的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟 源。该时钟源只能从 PLL 输出端获取,可以选择为 1.5 分频或者 1 分频,也就是,当需要使 用 USB 模块时,PLL 必须使能,并且时钟频率配置为 48MHz 或 72MHz。 另外,STM32 还可以选择一个时钟信号输出到 MCO 脚(PA8)上,可以选择为 PLL 输出的 2 分频、HSI、HSE、或者系统时钟。 系统时钟 SYSCLK, 它是供 STM32 中绝大部分部件工作的时钟源。 系统时钟可选择为 PLL 输出、HSI 或者 HSE。系统时钟最大频率为 72MHz,它通过 AHB 分频器分频后送给各模块使 用,AHB 分频器可选择 1、2、4、8、16、64、128、256、512 分频。其中 AHB 分频器输出 的时钟送给 5 大模块使用: ①、送给 AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟。 ②、通过 8 分频后送给 Cortex 的系统定时器时钟。 ③、直接送给 Cortex 的空闲运行时钟 FCLK。 ④、送给 APB1 分频器。APB1 分频器可选择 1、2、4、8、16 分频,其输出一路供 APB1 外设使用(PCLK1,最大频率 36MHz),另一路送给定时器(Timer)2、3、4 倍频器使用。该倍频 器可选择 1 或者 2 倍频,时钟输出供定时器 2、3、4 使用。 ⑤、送给 APB2 分频器。APB2 分频器可选择 1、2、4、8、16 分频,其输出一路供 APB2 外设使用(PCLK2,最大频率 72MHz),另一路送给定时器(Timer)1 倍频器使用。该倍频器可选 择 1 或者 2 倍频,时钟输出供定时器 1 使用。另外,APB2 分频器还有一路输出供 ADC 分频 器使用,分频后送给 ADC 模块使用。ADC 分频器可选择为 2、4、6、8 分频。 在以上的时钟输出中,有很多是带使能控制的,例如 AHB 总线时钟、内核时钟、各种 APB1 外设、APB2 外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。 需要注意的是定时器的倍频器,当 APB 的分频为 1 时,它的倍频值为 1,否则它的倍频 值就为 2。 连接在 APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、 UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意 USB 模块虽然需要一个 单独的 48MHz 时钟信号,但它应该不是供 USB 模块工作的时钟,而只是提供给串行接口引 擎(SIE)使用的时钟。USB 模块工作的时钟应该是由 APB1 提供的。 连接在 APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口。 /****************************************************************************** * * Function Name : RCC_Configuration

* Description : Configures the different system clocks. * Input : None * Output : None * Return : None ******************************************************************************* / void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; /* RCC system reset(for debug purpose) */ // RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//Pll 在最后设置 /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } }

/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Perip h_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); /* TIM2 clocks enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* CAN Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); } STM32 的学习心得之 TIMx(通用定时器) 基本的配置定时器的基本设置 1、TIM_TimeBaseStructure.TIM_Prescaler = 0x0;//时钟预分频数 例如:时钟频率=72/(时钟预 分频+1) 2、TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定时器模式 向上计 数 3、TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重装载寄存器周期的值(定时时间) 累 计 0xFFFF 个频率后产生个更新或者中断(也是说定时时间到) 4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值 5、TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器 2 6、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断 7、TIM_Cmd(TIM2, ENABLE);//打开定时器 此 外 要 记 住 一 定 要 打 开 定 时 器 的 时 钟 (RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);),定时器的频率的可以编程的,有 对应的模式设置和中断处理。 STM32 学习笔记之 串口通讯 主要功能是把 PC 机发送的数据接收后再返回给 PC 机参数 9600,8,1,N。 /************************************************************************ Copyright (c) 2008 wormchen All rights reserved 文 件 名: main.c 说 明: 串口发送接收数据 将 PC 端发来的数据返回给 PC 主要硬件: EMSTM32V1+miniSTMV100(外部 8MRC) 编译环境: MDK3.10 当前版本: 1.0 ************************************************************************/ #include void RCC_Config(void); void GPIO_Config(void); void USART_Config(void);

void Put_String(u8 *p); int main(void) { RCC_Config(); GPIO_Config(); USART_Config(); Put_String("\r\n 请发送数据_\r\n"); while(1) { while(1) { if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET) { USART_SendData(USART2, USART_ReceiveData(USART2)); } } } } /************************************************* 函数: void RCC_Config(void) 功能: 配置系统时钟 参数: 无 返回: 无 **************************************************/ void RCC_Config(void) { ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量 RCC_DeInit();//复位 RCC 外部设备寄存器到默认值 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟准备好 if(HSEStartUpStatus == SUCCESS)//外部高速时钟已经准别好 { RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置 AHB(HCLK)时钟等于==SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //配置 APB2(PCLK2)钟==AHB 时钟 RCC_PCLK1Config(RCC_HCLK_Div2);//配置 APB1(PCLK1)钟==AHB1/2 时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置 PLL 时钟 == 外部高速晶体时钟*9 RCC_PLLCmd(ENABLE);//使能 PLL 时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待 PLL 时钟就绪 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL 时钟 while(RCC_GetSYSCLKSource() != 0x08) //检查 PLL 时钟是否作为系统时钟 {

} } RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); //打开 GPIOD 和 AFIO 时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口 2 时钟 } /************************************************* 函数: void GPIO_Config(void) 功能: GPIO 配置 参数: 无 返回: 无 **************************************************/ void GPIO_Config(void) { //设置 RTS(PD.04),Tx(PD.05)为推拉输出模式 GPIO_InitTypeDef GPIO_InitStructure; //定义 GPIO 初始化结构体 GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能 GPIO 端口映射 USART2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//选择 PIN4 PIN5 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚频率 50M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚设置推拉输出 GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化 GPIOD //配置 CTS (PD.03),USART2 Rx (PD.06)为浮点输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); } /************************************************* 函数: void USART_Config(void) 功能: USART 配置 参数: 无 返回: 无 **************************************************/ void USART_Config(void) { USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体 USART_InitStructure.USART_BaudRate = 9600;//波特率 9600 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8 位数据 USART_InitStructure.USART_StopBits = USART_StopBits_1;//1 个停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //禁用 RTSCTS 硬件流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收 USART_InitStructure.USART_Clock = USART_Clock_Disable; //串口时钟禁止

USART_InitStructure.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效 USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉 USART_InitStructure.USART_LastBit = USART_LastBit_Disable; //最后数据位的时钟脉冲不输出到 SCLK 引脚 USART_Init(USART2, &USART_InitStructure);//初始化串口 2 USART_Cmd(USART2, ENABLE);//串口 2 使能 } /************************************************* 函数: void Put_String(void) 功能: 向串口输出字符串 参数: 无 返回: 无 **************************************************/ void Put_String(u8 *p) { while(*p) { USART_SendData(USART2, *p++); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) { } } } 基于 STM32 的 PWM 输出 ) 初始化函数定义: void TIM_Configuration(void); //定义 TIM 初始化函数 d) 初始化函数调用: TIM_Configuration(); //TIM 初始化函数调用 e) 初始化函数,不同于前面模块,TIM 的初始化分为两部分——基本初始化和通道初始化: void TIM_Configuration(void)//TIM 初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_OCInitTypeDef TIM_OCInitStructure;//通道输出初始化结构//TIM3 初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期 0~FFFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //基本初始化 TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//打开中断,中断需要这行代码 //TIM3 通道初始化 TIM_OCStructInit(& TIM_OCInitStructure); //默认参数

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //工作状态 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 设 定 为 输 出 , 需 要 PWM 输出才需要这行代码 TIM_OCInitStructure.TIM_Pulse = 0x2000; //占空长度 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平 TIM_OC4Init(TIM3, &TIM_OCInitStructure); //通道初始化 TIM_Cmd(TIM3, ENABLE); //启动 TIM3 } f) RCC 初始化函数中加入 TIM 时钟开启: RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE); g) GPIO 里面将输入和输出管脚模式进行设置。信号:AF_PP,50MHz。 h) 使用中断的话在 NVIC 里添加如下代码: //打开 TIM2 中断 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//占先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动 NVIC_Init(&NVIC_InitStructure); //初始化 中断代码: void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET) //判断中断来源 { TIM_ClearITPendingBit(TIM2, TIM_IT_CC4); //清除中断标志 GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1 1)));//变换 LED 色彩 IC4value = TIM_GetCapture4(TIM2); //获取捕捉数值 } } i) 简单应用: //改变占空比 TIM_SetCompare4(TIM3, 变量); j) 注意事项: 管脚的 IO 输出模式是根据应用来定,比如如果用 PWM 输出驱动 LED 则应该将相应管脚设 为 AF_PP,否则单片机没有输出。


相关文章:
stm32 can2设置问题
stm32 can2 设置问题在 stm32 的互联型产品中,有两个 can 接口,一个主,一个从,主接口一般正常配置,网上资料比较多, 但是从接口在配置的时候经常是只能发送,...
STM32通用定时器(TIM2-5)基本用法
STM32 通用定时器(TIM2-5)基本用法 (2011-08-18 21:13:42) STM32 的定时器是个强大的模块, 定时器使用的频率也是很高的, 定时器可以做一些基本的定时, ...
stm32重映射USART2方法及函数及理解
stm32f107 重映射 USART2 USART2 默认的 TX/RX 在 PA.2/3,若 PA.2/3 用于其它用途,需要把 USART2 的 TX/RX 重 映射到 PD.5/6。 库函数的调用 (...
Stm32 学习笔记2
Stm32 学习笔记2_计算机硬件及网络_IT/计算机_专业资料。今日推荐 68...STM32学习笔记2 -μVisi... 1页 免费 STM32学习笔记(初学者快... 24页 ...
学习STM32笔记2 如何配置时钟
学习STM32笔记2 如何配置时钟_信息与通信_工程科技_专业资料。详细介绍了STM32 配置时钟使用过程,配置方法,是学习STM32配置时钟的好教程 ...
STM32_TIM2
#ifndef __TIM2_H_ #define __TIM2_H_ #define TIM2_IsValid 1 #if TIM2_IsValid #define TIM2_Mode TIMx_ModeCounter #include "stm32f10x_conf.h"...
STM32主控两轮直立小车2
STM32主控两轮直立小车2_机械/仪表_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 STM32主控两轮直立小车2_机械/仪表_工程科技_专业资料。STM32 主控...
STM32 实验2报告
STM32 实验2报告_计算机硬件及网络_IT/计算机_专业资料。实验 2 MINI STM32 按键控制 LED 灯实验 一、 实验目的 1、 掌握嵌入式程序设计流程。 2、 熟悉 STM...
如何在ram中调试STM32程序 (2)
如何在ram中调试STM32程序 (2)_计算机硬件及网络_IT/计算机_专业资料。在盘古STM32开发板上通过实验,写成了本文。并利用源享科技学习开发板软件平台上、ALIENTEK...
STM32设置定时器TIM2
STM32设置定时器TIM2_计算机硬件及网络_IT/计算机_专业资料。STM32设置定时器TIM2STM32 如何设置定时器 STM32 如何设置定时器 下面以 stm32 的 TIM2 作为实例一...
更多相关标签: