STM32各模块学习笔记
STM32 中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3) 中的优先级概念STM32(Cortex-M3) 中有两个优先级的概念 —— 抢占式优先级和响应优先级,有人把响应优 先级称作 '亚优先级 '或 '副优先级 ',每个中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应, 即中断嵌 套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时, 这两个中断将没有嵌套关系, 当一个中断到来后, 如 果正在处理另一个中断, 这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如 果这两个中断同时到达, 则中断控制器根据他们的响应优先级高低来决定先处理哪一个; 如 果他们的抢占式优先级和响应优先级都相等, 则根据他们在中断表中的排位顺序决定先处理 哪一个。
既然每个中断源都需要被指定这两种优先级, 就需要有相应的寄存器位记录每个中断的优先 级;在 Cortex-M3 中定义了 8 个比特位用于设置中断源的优先级,这 8 个比特位可以有 8 种分配方式,如下:这就是优先级分组的概念。
Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此 STM32 把指定中断优先级的寄存器位减少到 4 位,这 4个寄存器位的分组方式如下:第 0 组:所有 4 位用于指定响应优先级第 1 组:最高 1 位用于指定抢占式优先级,最低 第 2 组:最高 2 位用于指定抢占式优先级,最低 第 3 组:最高 3 位用于指定抢占式优先级,最低 第 4 组:所有 4 位用于指定抢占式优先级所有 8 位用于指定响应优先级 最高 1 位用于指定抢占式优先级, 最高 2 位用于指定抢占式优先级, 最高 3 位用于指定抢占式优先级, 最高 4 位用于指定抢占式优先级, 最高 5 位用于指定抢占式优先级, 最高 6 位用于指定抢占式优先级, 最高 7 位用于指定最低 7 位用于指定响应优先级最低 6 位用于指定响应优先级最低 5 位用于指定响应优先级最低 4 位用于指定响应优先级最低 3 位用于指定响应优先级最低 2 位用于指定响应优先级最低 1 位用于指定响应优先级3 位用于指定响应优先级2 位用于指定响应优先级可以通过调用STM32 的固件库中的函数NVIC_PriorityGroupConfig() 选择使用哪种优先级分组方式,这个函数的参数有下列 5 种:NVIC_PriorityGroup_0 => 选择第0 组NVIC_PriorityGroup_1 => 选择第 1 组NVIC_PriorityGroup_2 => 选择第2 组NVIC_PriorityGroup_3 => 选择第 3 组NVIC_PriorityGroup_4 => 选择第4 组接下来就是指定中断源的优先级,面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:// 选择使用优先级分组第 1 组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 使能EXTI0 中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别 1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能EXTI9_5 中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别 1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);要注意的几点是:1) 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2) 抢占式优先级别相同的中断源之间没有嵌套关系;3) 如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
二,开关总中断:在STM32/Cortex-M3 中是通过改变CPU 的当前优先级来允许或禁止中断。
PRIMASK 位:只允许NMI 和hard fault 异常,其他中断/异常都被屏蔽(当前CPU 优先级=0)。
FAULTMASK 位:只允许 NMI ,其他所有中断 /异常都被屏蔽 (当前 CPU 优先级 =-1)。
在 STM32 固件库中 (stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定义了四个函数操作 位和 FAULTMASK 位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。
下面两个函数等效于关闭总中断:void NVIC_SETPRIMASK(void) ;void NVIC_SETFAULTMASK(void) ;下面两个函数等效于开放总中断:void NVIC_RESETPRIMASK(void) ;void NVIC_RESETFAULTMASK(void) ;上面两组函数要成对使用,不能交叉使用。
例如: 第一种方法:NVIC_SETPRIMASK() ; //关闭总中断 NVIC_RESETPRIMASK() ;//开放总中断 第二种方法:NVIC_SETFAULTMASK() ; //关闭总中断NVIC_RESETFAULTMASK() ; //开放总中断常常使用NVIC_SETPRIMASK(); NVIC_RESETPRIMASK(); STM32 时钟系统STM32 资料 2009-09-23 14:53 阅读 72 评论 0 字号: 大大 中中 小小在 STM32 中,有五个时钟源,为 HSI 、HSE 、LSI 、LSE 、PLL 。
① 、HSI 是高速内部时钟,RC 振荡器,频率为 8MHz 。
② 、 HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz 。
PRIMASK // Disable Interrupts// Enable Interrupts③、LSI是低速内部时钟,RC振荡器,频率为40kHz。
④、LSE 是低速外部时钟,接频率为32.768kHz 的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16 倍,但是其输出频率最大不得超过72MHz。
图 1 HSE/LSE 时钟源其中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、Timerl、ADC1、ADC2、所有普通10 口(PA~PE)、第二功能IO 口。
下图是STM32 用户手册中的时钟系统结构图,通过该图可以从总体上掌握STM32 的时钟系统。
STM32 外部中断之二STM32 资料2009-09-10 21:18 阅读243 评论0 字号:大大中中小小STM32 外部中断配置1 配置中断1 、分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_V ectTab_RAM, 0x0);2、设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置中断优先级3、初始化外部中断:/* 允许EXTI4 中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; // 中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;// 强占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 通道中断使能NVIC_Init(&NVIC_InitStructure); // 初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4, PD4等,那么采用的外部中断也必须是EXTI4 ,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1 ,其他类推。
《STM32Cube高效开发教程》笔记
《STM32Cube高效开发教程》读书笔记目录一、前言 (2)1.1 书籍简介 (3)1.2 编写目的 (4)二、STM32Cube概述 (5)2.1 STM32Cube的意义 (6)2.2 STM32Cube的主要特点 (7)三、安装与配置 (9)3.1 STM32Cube的安装 (10)3.2 开发环境的配置 (11)四、创建项目 (12)4.1 新建项目 (13)4.2 项目设置 (14)五、HAL库介绍 (15)5.1 HAL库简介 (16)5.2 HAL库的主要组件 (18)六、STM32最小系统 (19)6.1 STM32最小系统的组成 (21)6.2 STM32最小系统的应用 (22)七、GPIO操作 (24)7.1 GPIO的基本概念 (25)7.2 GPIO的操作方法 (26)八、中断系统 (28)8.1 中断的基本概念 (29)8.2 中断的处理过程 (31)九、定时器 (33)9.1 定时器的功能介绍 (34)9.2 定时器的操作方法 (36)十五、文件系统 (37)一、前言随着科技的飞速发展,嵌入式系统已广泛应用于我们生活的方方面面,从智能手机到自动驾驶汽车,其重要性不言而喻。
而STM32作为一款广泛应用的微控制器系列,以其高性能、低功耗和丰富的外设资源赢得了广大开发者的青睐。
为了帮助开发者更好地掌握STM32系列微控制器的开发技巧,提升开发效率,我们特别推出了《STM32Cube 高效开发教程》。
本书以STM32Cube为核心,通过生动的实例和详细的讲解,全面介绍了STM32系列微控制器的开发过程。
无论是初学者还是有一定基础的开发者,都能从中找到适合自己的学习内容。
通过本书的学习,读者将能够更加深入地理解STM32的内部结构和工作原理,掌握其编程方法和调试技巧,从而更加高效地进行嵌入式系统的开发和应用。
在科技日新月异的今天,STM32系列微控制器将继续扮演着举足轻重的角色。
STM32自学笔记
STM32⾃学笔记⼀、原⼦位操作:原⼦位操作定义在⽂件中。
令⼈感到奇怪的是位操作函数是对普通的内存地址进⾏操作的。
原⼦位操作在多数情况下是对⼀个字长的内存访问,因⽽位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。
原⼦操作中的位操作部分函数如下:void set_bit(int nr, void *addr)原⼦设置addr所指的第nr位void clear_bit(int nr, void *addr)原⼦的清空所指对象的第nr位void change_bit(nr, void *addr)原⼦的翻转addr所指的第nr位int test_bit(nr, void *addr)原⼦的返回addr位所指对象nr位inttest_and_set_bit(nr, void *addr)原⼦设置addr所指对象的第nr位,并返回原先的值int test_and_clear_bit(nr, void *addr)原⼦清空addr所指对象的第nr位,并返回原先的值int test_and_change_bit(nr, void *addr)原⼦翻转addr所指对象的第nr位,并返回原先的值unsigned long word = 0;set_bit(0, &word); /*第0位被设置*/set_bit(1, &word); /*第1位被设置*/clear_bit(1, &word); /*第1位被清空*/change_bit(0, &word); /*翻转第0位*/⼆、STM32的GPIO锁定:三、中断挂起:因为某种原因,中断不能马上执⾏,所以“挂起”等待。
⽐如有⾼、低级别的中断同时发⽣,就挂起低级别中断,等⾼级别中断程序执⾏完,在执⾏低级别中断。
四、固⽂件:固件(Firmware)就是写⼊EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。
STM32学习笔记及勘误手册
/******************************************************************* 文件名:书写程序中一些特别需要留意的地方文件编辑人:张恒编辑日期:15/11/23功能:快速查阅巩固知识点*******************************************************************/ 版本说明:v1.0版本:1.开始编辑书写整个文档,开始用的为TXT文档的形式,整理了部分学习到的东西和一些在书写常用程序中容易出错的地方,以及经常忽视细节而导致程序运行失败,是巩固知识点,提醒值得注意地方的工具文档。
2.添加的功能上基本涵盖了所有的模块,除了串口通信中的SPI和I2C、I2S等,应用是比较简单后续可能会添加。
3.对一些特定的功能综合应用并未加入进去,这是一个不好的地方,后续应该会随着学习总结更新,每次更新记录为一个版本。
// 2015/11/24;v1.1版本:1.将所有的TXT版本的文档全部转换为DOC模式,并且更新的加入了目录显示,显示为1级目录,方便查阅相关内容。
2.更新了SysTick书写中值得注意的地方3.更新了FSMC的一些细微操作,后续继续追捕更新书写细节。
V1.2版本:1.更新了FSMC部分功能显示,详细了FSMC的使用注意事项2.添加了RTC实时时钟的一些注意事项。
//2015/12/1;V1.3版本:1.更新RTC部分注意事项。
//2015/12/11V1.4版本:1.更新ADC校准标志部分注意事项。
2.更新了TIM1和TIM8的高级定时器特殊功能说明。
//2015/12/13V1.5版本:1.优化了部分注意事项,SysTick的写法上重新的定制写法。
2.优化了ADC在使用过程的一些细节注意地方。
3.面对最近出现的浮点数运算错误,配合AD数据进行总结。
4.RTC细节的把握-配置正确顺序的错误。
stm32自学笔记共20页
•
LED0=1;
•
LED1=0;
•
delay_ms(300);
•
}
•}
第二章 跑马灯实验
• Led.c函数
• void LED_Init(void)
•{
•
RCC->APB2ENR|=1<<2; //使能PORTA时钟
•
GPIOA->CRH|=0XFFFFFFFF3;//PA8 推挽输出
•
GPIOA->ODR|=1<<8; //PA8 输出高
• JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD,在原理图上可以看 到PA13和PA15为键盘和JTAG与SWD所共用,而这两种方针接口,他们 和普通的IO口公用,当想使用普通IO口时,必须先把他们关闭。在这 个函数里面设置参数,如果为二进制数00,则代表全部使能,如果是 二进制数01,则是能SWD,如果是10,则表示全部关闭。JTAG是一种 国际标准测试协议,主要用于芯片内部的测试。
• }要想实现一个点亮led小灯的功能,最少只需对3个寄存器进行设 置,第一步是设置外设时钟使能先把PORTA时钟使能,接下来把IO
口设置为输出,在接下来设置输出为高电平还是低电平,这里使用 推挽输出(3.3v),推挽输出主要是增强驱动能力,为外部提供大电 流。
第二章 跑马灯实验
• #ifndef __LED_H • #define __LED_H • #include "sys.h" • #define LED0 PAout(8)// PA8 • #define LED1 PDout(2)// PD2 • void LED_Init(void);//初始化
《STM32库开发实战指南 基于STM32F103 第2版 》读书笔记思维导图
31.5 定时器初始化 结构体详解
31.6 PWM互补输 出实验
31.7 脉宽测量输入 捕获实验
31.8 PWM输入捕 获实验
32.1 电容按键 原理
32.2 电容按键 检测实验
33.1 IWDG简介
33.2 IWDG功能框 图剖析
33.3 怎么用IWDG
33.4 IWDG超时实 验
34.1 WWDG简介
11.2 软件设计
11.1 硬件设计
11.3 STM32标准 库补充知识
12.2 软件设计
12.1 硬件设计
12.3 下载验证
13.1 位带简介
13.2 GPIO位 带操作
14.2 查找ARM汇 编指令
14.1 启动文件简介
14.3 启动文件代码 讲解
15.2 RCC框图剖 析——时钟部分
4 40.4 操作内部
Flash的库函 数
5
40.5 实验:读 写内部Flash
41.1 选项字节与读 写保护
41.2 修改选项字节 的过程
41.3 操作选项字节 的库函数
41.4 实验:设置读 写保护及解除
42.2 OV7725摄像 头
42.1 摄像头简介
42.3 摄像头驱动实 验
43.1 Huawei Lite OS简...
18.2 Sys Tick寄存 器介绍
18.1 Sys Tick简介
18.3 Sys Tick定时 实验
19.1 串行通信与并 行通信
19.2 全双工、半双 工及单工通信
19.3 同步通信与异 步通信
19.4 通信速率
01
20.1 串口 通信协议简 介
02
20.2 STM32的 USART简 介
stm32相关笔记——ADC部分
stm32相关笔记——ADC部分我们在学习⼀门技术的时候,应该对它的理论部分有所了解,然后才能在实践中进⼀步加深理解,进⽽掌握。
对于stm32来说,我认为学习的时候应该先仔细阅读相关的参考⼿册,然后再动⼿实践,这样才能理解得更加透彻,掌握得更加牢固!今天记录⼀下我学习stm32的ADC部分的了解。
1.介绍⼩结:stm32的ADC有18个通道(16个外部通道+2个内部通道),有单次、连续、扫描和间断四种模式,ADC的结果可以左对齐和右对齐的⽅式存储在16位的数据寄存器中(⼀般我们都是使⽤右对齐的⽅式)2、特征3、框图框图应该是最重要的部分了,理解了框图,对这个外设的理解就⽐较透彻了。
①模拟⾄数字转换器中有两个通道,⼀个是注⼊通道,⼀个是规则通道,对应的转换结果也是存储到注⼊通道数据寄存器和规则通道数据寄存器中(都是16位的);②注⼊通道数据寄存器有4个,规则通道数据寄存器只有1个,规则通道最多可以转化16个通道的数据,⽽结果都是存储在⼀个规则通道数据寄存器中,为了避免数据丢失,可以采⽤DMA搬运数据,提⾼效率。
③触发注⼊通道开始转化的外部触发信号有8种,如图所⽰,其中TIM8_CH4及其重映射只存在于⼤容量的产品中。
④类似于注⼊通道,触发规则通道的外部触发信号也有8种,如图所⽰,其中TIM8_TRGO及其重映射也只存在于⼤容量产品中。
⑤以上的两点只针对ADC1和ADC2,ADC3的触发信号有所不同,如图所⽰:⑥转换的过程如图,ADCx_IN0~ADCx_IN15共16个外部通道,通过GPIO端⼝将模拟量传达到模拟⾄数字转化器中的注⼊通道或者规则通道,另外还有两个内部通道温度传感器和V REFINT,同样也可以将模拟量传送到模拟⾄数字转化器中的注⼊通道或者规则通道,注⼊通道最多可以转换4个通道的模拟量,转换结果存储到注⼊通道数据寄存器中,转换完成后会产⽣JEOC标志位,规则通道最多可以转换16个通道,转换结果存储到规则通道数据寄存器中,转换完成后会产⽣EOC标志位。
stm32学习笔记--spi与iic
stm32学习笔记--spi与iic关于上次说的要改程序的问题,//读ADXL345 寄存器//addr:寄存器地址//返回值:读到的值u8 ADXL345_RD_Reg(u8 addr){u8 temp=0; IIC_Start(); IIC_Send_Byte(ADXL_WRITE); //发送写器件指令temp=IIC_Wait_Ack(); IIC_Send_Byte(addr); //发送寄存器地址temp=IIC_Wait_Ack(); IIC_Start(); //重新启动IIC_Send_Byte(ADXL_READ); //发送读器件指令temp=IIC_Wait_Ack(); temp=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NAK IIC_Stop(); //产生一个停止条件return temp; //返回读到的值} 这段写寄存器代码,不理解temp 为什么要被频繁的赋值,去掉后,宏观看来对结果没有影响。
第二个不理解的地方是为什么在发送寄存器地址之后要从新启动一次,因为在相似的写寄存器函数中,在相同的位置不存在重启代码。
注释掉该句之后显示ADXL345 error。
这两天主要看了三轴加速度计的程序,虽然例程里的能看懂,但是在四轴里的程序却不那么容易,我甚至不明白为什么他要自己写一个iic 的函数,我打算接下来把它的程序和例程里的程序对照来看,看能不能找到什么头绪。
下面是对以前学过内容的总结:对位的寻址操作为了实现对SARM、I/O 外设空间中某一位的操作,在寻址空间(4GB)另一地方取个别名区空间,从这地址开始,每一个字(32bit)就对应SRAM 或I/O 的一位。
即原来每个字节用一个地址,现在给字节中的每个位一个地址,实现了对位的寻址。
spi 与iic 之间各自的优劣1 硬件连接的优劣SPI 是[单主设备(single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。
STM32学习心得笔记
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倍频器使用。
STM32学习笔记
一、GPIO操作IO 的方法:1)使能IO 口时钟。
调用函数为RCC_APB2PeriphClockCmd()。
2)初始化IO 参数。
调用函数GPIO_Init();3)操作IO。
GPIO_Mode有: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 //复用推挽IO 口速度设置:GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz,GPIO_Speed_50MHz初始化结构体初始化GPIO 的常用格式://初始化PGIO_PC.4为上拉输入GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC.4 端口配置GPIO_Mode_IPU = 0x48, //上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能,GPIOA 时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.0 发送端读GPIOA.5 的电平状态:GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);控制IO 口的输出状态:void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);设置GPIOA 的第1 个端口值为1,那么你只需要往寄存器BSRR 的低16 位对应位写1 即可:GPIOA->BSRR=1<<1;如果你要设置GPIOA 的第1 个端口值为0,你只需要往寄存器高16 位对应为写1 即可:GPIOA->BSRR=1<<(16+1)对应函数void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);STM32 的IO 口做输入使用的时候,是通过调用函数GPIO_ReadInputDataBit()来读取IO 口的状态的在配置STM32 外设的时候,任何时候都要先使能该外设的时钟!二、串口串口设置的一般步骤可以总结为如下几个步骤:1) 串口时钟使能,GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)6) 使能串口7) 编写中断处理函数1.串口时钟使能。
STM32f103C8T6入门学习记录
STM32自学笔记作者:忙碌的小姚新浪微博:@忙碌的小姚新浪博客:/mlxiaoyao222目录STM32 自学笔记 (1)第一章 (3)我与STM32 的那些日子 (3)第二章 (4)使用固件库建立一个工程 (4)1、了解STM32F103的固件库 (4)2、创建第一个工程 (4)3、接下来就是管理工程文件了 (9)4、编写main.c 和文件路径 (10)第三章 (14)STM32点亮第一个LED 使用keil for ARM MDK 软件仿真 (14)1、Main.c 函数代码: (14)2、代码分析: (15)3、软件仿真介绍: (16)第四章 (19)串口的使用 (19)1、为什么要用串口? (19)2、STM32跟PC机(也就是电脑)如何连接 (19)3、代码分析 (20)4、仿真及调试 (23)5、串口接收数据 (25)第五章 (27)通用定时器的使用 (27)1、STM32F103内部定时器有哪些? (27)2、如何进行程序编写 (27)3仿真结果观察 (30)4对第四章串口的补充 (31)5工程代码 (35)第一章我与STM32 的那些日子STM32这块板子是在阿莫上跟一个老师买的,砍了半天100块钱。
包括一个Jlink v8仿真器(好像65块左右),和一块STM32系统板。
那已是一年前的事了。
那时我刚大三,刚学了半年51,于是想学点更高级的。
但我好像属于三分钟热度的这种人,买回来学了一个星期,就学不动了,寄存器操作,固件库的使用根本就没明白是怎么一回事,之后就没有然后了。
现在看到那块板子,总有一种说不出的滋味,要是当时能咬牙切齿努力学习,说不定现在也不会安静地坐在电脑前一字一句敲打这篇激励性文章了。
对于STM32我没用任何基础,唯一有的也只是一年前学的那一个星期,不过那已不重要了,我现在仍是一个小白。
作为一个初学者,也许是坐井观天,看的是片面的,可能有很多观点是错误的,希望读者朋友能勇于指出来。
