stm32

STM32时钟系统

非 Y 不嫁゛ 提交于 2020-01-30 04:28:53
1. STM32 有 5 个时钟源 :HSI 、 HSE 、 LSI 、 LSE 、 PLL 。   ①、 HSI 是高速内部时钟, RC 振荡器,频率为 8MHz ,精度不高。    ②、 HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz 。    ③、 LSI 是低速内部时钟, RC 振荡器,频率为 40kHz ,提供低功耗时钟。 WDG    ④、 LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。 RTC    ⑤、 PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2 、 HSE 或者 HSE/2 。倍频可选择为2~16 倍,但是其输出频率最大不得超过 72MHz 。 2. 系统时钟 SYSCLK 可来源于三个时钟源: ①、 HSI 振荡器时钟 ②、 HSE 振荡器时钟 ③、 PLL 时钟 3.STM32 可以选择一个时钟信号输出到 MCO 脚 (PA8) 上,可以选择为 PLL 输出的 2 分频、 HSI 、 HSE 、或者系统时钟。 4. 任何一个外设在使用之前,必须首先使能其相应的时钟。 几个重要的时钟: SYSCLK( 系统时钟 ) : AHB 总线时钟 APB1总线时钟 ( 低速 ): 速度最高 36MHz APB2 总线时钟 ( 高速 ): 速度最高 72MHz PLL 时钟 参考资料:

STM32库函数与寄存器的区别

无人久伴 提交于 2020-01-30 02:15:11
#STM32库函数与寄存器# 1.固件库是什么?与寄存器有什么关系? 固件库就是函数的集合,向下与寄存器直接打交道,向上提供用户调用函数的接口(API) 2.最佳使用情况 寄存器:单独对IO口状态控制,对寄存器进行位操作(如51) 调试debug时对寄存器进行位操作(需要理解与什么寄存器有关并理解过程,调试时翻阅寄存器手册) 库函数:寄存器数量过多(如STM32)调用库函数 来源: CSDN 作者: 等登灯灯 链接: https://blog.csdn.net/qq_45163431/article/details/104109431

STM32 中断优先级管理NVIC

放肆的年华 提交于 2020-01-29 17:57:19
STM32内核为CM3 CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。 STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个) 1.中断管理方法 首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 (分组配置是在寄存器SCB->AIRCR中配置) 抢占优先级 & 响应优先级区别 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。 PS:一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。 2.相关寄存器 中断设置相关寄存器 __IO uint8_t IP[240]; //中断优先级控制的寄存器组 __IO uint32_t ISER[8]; /

STM32驱动SDIO WIFI 介绍(十六) ---- 上位机UDP操作/代码

最后都变了- 提交于 2020-01-29 06:59:04
代码工程的GITHUB连接: 点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi Marvell自己实现驱动系列文章分为几篇介绍: SDIO wifi Marvell8801/Marvell88w8801 介绍(一) ---- 芯片介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(二) ---- SDIO协议介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- 寄存器介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(四) ---- 命令/事件/数据格式 SDIO wifi Marvell8801/Marvell88w8801 介绍(五) ---- TLV SDIO wifi Marvell8801/Marvell88w8801 介绍(六) ---- 实现初始化功能 SDIO wifi Marvell8801/Marvell88w8801 介绍(七) ---- 实现搜索功能 SDIO wifi Marvell8801/Marvell88w8801 介绍(八) ---- 实现STA功能 SDIO wifi Marvell8801

STM32 MCO输出HSE、LSI等时钟波形以及使用LSI发现内部RC震荡频率紊乱的问题

一笑奈何 提交于 2020-01-29 05:37:37
最近调试产品遇到了一个问题,现象是产品RTC计数不准,定的5s的采样周期,实际表现确是3s多,而且每次间隔还在波动,后来追查到应该是关于STM32的LSI内部RC震荡频率有时会不准,由于问题不好复现,所以采用MCO将内部RC震荡频率输出接到示波器上查看,在此记录下STM32配置MCO(基于HAL库)。 STM32是通过PA8管脚输出MCO信号的,个别大容量的型号可能有两个IO可输出MCO,我手里使用的STM32L431只有一路,调用库函数配置十分简单,只需要一句话即可: HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_LSI, RCC_MCODIV_1); 我们具体看下库函数内的内容: /** * @brief Select the clock source to output on MCO pin(PA8). * @note PA8 should be configured in alternate function mode. * @param RCC_MCOx specifies the output direction for the clock source. * For STM32L4xx family this parameter can have only one value: * @arg @ref RCC_MCO1

STM32的Cube学习笔记(ADC)

℡╲_俬逩灬. 提交于 2020-01-29 05:32:43
经过具体实验可知,以前思学师哥的程序中有ADC开始DMA采集和停止DMA采集两个函数,可以理解成消抖,因为采集频率过快数据可能会发飘。 硬石资料如下 配置要求一定要在mode处勾选circular ,数据宽度一定要选择“Word” 根据实验只需要将ADC的DMA通道采集打开,无需关闭即可采集成功,而且数据比较稳定,这样为快速傅里叶变换做出了准备。 经过一下午的实验可知ADC采集周期过短的时候在同时调用基本定时器PWM输出,高级定时器PWM输入捕获,串口中断程序,由实验可知无法通过硬石的方法使得ADC正常采集数据,因此思学师哥程序的性价比更高,有始有终才是做事的原则,程序如下。 //常用采集的数组 u32 uhADCxConvertedValue[2]; ADC循环采集,采集频率设置需要从以下图中选项设置时钟触发。 定时器按照下图进行配置即可获得10K的ADC采集频率,上次从硬石教材中的ADC循环采集由于使用的默认系统时钟进行采集,在进行了多项硬件设备的初始化后,默认系统时钟受到影响。 代码补充方面: 需要补充定时器中断触发函数,在进入while之前进行补充 需要补充定时器中断服务回调函数 在tim.c中补全下列代码。 * / USER CODE BEGIN 1 / //回调函数,定时器中断服务函数调用 void HAL_TIM_PeriodElapsedCallback(TIM

STM32串口 ASCII 的数字接收与发收

白昼怎懂夜的黑 提交于 2020-01-29 05:32:06
STM32 ASCII 的数字接收与发收 STM32串口 ASCII 的数字接收与发收 串口发送 先重定义,如下 int fputc ( int ch , FILE * f ) { HAL_UART_Transmit ( & huart1 , ( uint8_t * ) & ch , 1 , 1 ) ; return ch ; } 数据量大的可用DMA,亲测有效 int fputc ( int ch , FILE * f ) { while ( HAL_UART_Transmit_DMA ( & huart1 , ( uint8_t * ) & ch , 1 ) != HAL_OK ) ; return ch ; } 发送的内容用printf即可 串口的数字接收 接收ASCII的数字并组合,此函数可处理 有小数的正负和无小数的正负 //此函数用于接收ascii码的数字,可方便后续的计算 /* uint8_t *rxbuffer 存放数据的数组 */ float readstring ( uint8_t * rxbuffer ) { float str = 0 ; //返回的变量 int sum = 0 ; float t = 0 , c = 0 , z = 0 , a = - 1 ; //作为中间变量 uint8_t flag = 0 ; //做标记位,判断有无小数点 for (

STM32,ARM,Keil工具相关

China☆狼群 提交于 2020-01-28 16:11:01
One ELF Section per Function https://blog.csdn.net/iceiilin/article/details/6091575 因此,可以得出,选项One ELF Section per Function的主要功能是对冗余函数的优化。通过这个选项,可以在最后生成的二进制文件中将冗余函数排除掉(虽然其所在的文件已经参与了编译链接),以便最大程度地优化最后生成的二进制代码。 而该选项实现的机制是将每一个函数作为一个优化的单元,而并非整个文件作为参与优化的单元。 选项One ELF Section per Function所具有的这种优化功能特别重要,尤其是在对于生成的二进制文件大小有严格要求的场合。人们习惯将一系列接口函数放在一个文件里,然后将其整个包含在工程中,即使这个文件将只有一个函数被用到。这样,最后生成的二进制文件中就有可能包含众多的冗余函数,造成了宝贵存储空间的浪费。 The One ELF Section per Function option tells the compiler to put all functions into their own individual ELF sections. This allows the linker to remove unused functions. An ELF code

stm32之IIC通信协议

…衆ロ難τιáo~ 提交于 2020-01-28 03:57:12
1 //³õʼ»¯IIC 2 void IIC_Init(void) 3 { 4 GPIO_InitTypeDef GPIO_InitStructure; 5 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //ʹÄÜGPIOBʱÖÓ 6 7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; 8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //ÍÆÍìÊä³ö 9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 10 GPIO_Init(GPIOB, &GPIO_InitStructure); 11 GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 Êä³ö¸ß 12 } 13 //²úÉúIICÆðʼÐźŠ14 void IIC_Start(void) 15 { 16 SDA_OUT(); //sdaÏßÊä³ö 17 IIC_SDA=1; 18 IIC_SCL=1; 19 delay_us(4); 20 IIC_SDA=0;//START:when CLK is high,DATA

STM32笔记之 GPIO引脚

≡放荡痞女 提交于 2020-01-27 00:16:08
写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 目录 一、GPIO模式 二、外设 I/O配置模式选择 三、GPIO配置代码实现 四、总工程实现 一、GPIO模式 STM32的 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 -- 推挽式复用功能 typedef enum { GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18 }GPIOMode_TypeDef; 为了后面的代码参考,顺便在上面贴上