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

初学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 开发入门教程_图文
(2) 打开 GPIOA 的时钟, 因为 STM32 是一个低功耗的 MCU , 每一个你使用的外围设备都 需要单独开启时钟, 如果不开启将不能使用, 这个也是对于 STM32 初学...
STM32入门基本知识
STM32 学前班教程:怎么开发 sw 笨笨的 STM32 学前班教程之二:怎么开发目前手头的入门阶段使用的开发器概述 该产品为简易 STM32 调试器和 DEMO 板一体化的调试...
图文结合建立第一个STM32工程_初学者必看
主​要​讲​述​首​次​建​立​S​T​M​3​2​的​详​细​过​程​。STM32工程 图文结合教你在 RVMDK 上建立自己的 ST...
stm32f107_的学习(新手入门)_图文
3,然后,讲讲对于 STM32 学习,熟悉过程可以分以下阶段: 1、入门程序的熟悉 2、GPIOX 的操作,各类寄存器原理的了解 3、逐个寄存器熟悉 4、中断,定时器的基础入门...
STM32嵌入式入门必看之文章介绍非常详细(学习STM32的理由
问题 1:我是学单片机好还是直接学 STM32 好???: 如何才能快速入门? 问题 2:STM32 如何才能快速入门? : 问题 3:为什么是 STM32 呢?为什么不是 ARM9,ARM...
STM32入门与学习笔记
2、 其他的有用文档,对初学帮助很大 a) 如何使用 STM32 的软件库在 IAR 的 EWARM 下进行应用开发——IAR 基础设置。 b) 轻松进入 STM32+Cortex-M3 世界....
Stm32 学习笔记2
Stm32 学习笔记2_计算机硬件及网络_IT/计算机_专业资料。今日推荐 68...STM32学习笔记2 -μVisi... 1页 免费 STM32学习笔记(初学者快... 24页 ...
STM32入门C语言详解
STM32入门C语言详解_其它语言学习_外语学习_教育专区。STM32入门C语言阅读...GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//输出速度 2MHz GPIO_...
初学STM32-1
STM32 学前班教程:怎么开发 sw 笨笨的 STM32 学前班教程之二:怎么开发目前手头的入门阶段使用的开发器概述 该产品为简易 STM32 调试器和 DEMO 板一体化的调试...
stm32入门c语句详解
stm32入门c语句详解_计算机软件及应用_IT/计算机_专业资料。stm32入门c语句详解...//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); / / 设置 N V I C ...
更多相关标签:
stm32初学者 | 初学stm32 | 瑜珈初学视频教程2 | dota2初学者 | selenium2初学者指南 | angular2初学者视频 | 水兵舞第2套初学视频 | 初学舞的三种舞步2 |