
STM32F1 开发
文章平均质量分 68
沙漏里的时光-
这个作者很懒,什么都没留下…
展开
-
5、STM32 定时器的使用
STM32 一共有 11 个定时器, 其中 2 个高级控制定时器, 4 个通用定时器和 2 个基本定时器, 以及 2 个看门狗定时器和 1 个系统滴答定时器(SysTick), 计数器均为 16 位。定时器计数器类型预分频系数DMA请求捕获/比较通道互补输出TIM1向上/向下原创 2016-11-27 13:36:48 · 1509 阅读 · 0 评论 -
2、STM32 系统时钟配置
STM32F103外部接8M的振荡器,经过倍频后最高可达72MHz。目前TI的M3系列芯片最高可达80MHz。在stm32固件库3.0中对时钟频率的选择进行了大大的简化,系统调用函数为 SystemInit();该函数中会对系统各个总线时钟进行如下配置 :constuint32_t SystemFrequency = SYSCLK_FREQ_72MHz; /* 硬件频原创 2016-11-27 11:53:28 · 351 阅读 · 0 评论 -
21、keil 生成 bin 文件的方法
在 options for target 中的 user 界面Run User Program After Build/Rebuild 选项中, 勾选 Run #1, 并填写如下 :fromelf.exe --bin -o "$L@L.bin" "#L"重新编译程序,即可在 obj 目录下得到 bin 文件原创 2016-12-11 16:21:33 · 255 阅读 · 0 评论 -
22、FreeRTOS 在 STM32 上的移植
STM32 上可以移植很多优秀的操作系统,有了操作系统之后,第一,可以提高 CPU 的利用率,第二,可以更好的利用多任务,从而实现不同功能模块的分离。这里介绍 FreeRTOS 的移植,FreeRTOS 是一个小型的高效的实时操作系统,移植与使用都比较简单。FreeRTOS 可以去官网下载最新版 https://sourceforge.net/projects/freertos/原创 2016-12-11 16:29:01 · 435 阅读 · 0 评论 -
23、STM32 上系统精确延时与获取 micro 时间函数的实现(FreeRTOS 中也能移植)
在编程中经常需要精确的延时,或者需要精确的统计一段代码的执行时间,亦或者是需要精确的保证某段代码被调用的频率。比如需要统计某个函数的执行时间,从而判断开销,又比如在飞控中需要精确的保证每隔 2m 调用一次读取传感器的函数,可以使用定时器去实现。在 STM32 平台上,我们可以充分的利用 systick 去实现。static volatile uint32_t sysTickMill原创 2016-12-11 17:15:46 · 3209 阅读 · 1 评论 -
24、USART 使用 ringbuffer 实现无阻塞的读写
在使用串口的使用中,由于速率比较低,因此数据的收发都比较占用资源。尤其是数据的输入,因为在程序的执行过程中无法预知到底何时才有数据过来,采用中断的方式去实现接收也有弊端,当需要解析帧协议时需要不断的去判断是否有足够一帧的数据,而且在发送过程中也无法实现无阻塞。从而浪费了大量的 CPU 资源。这里采用一种 ringbuffer 的方式去实现无阻塞的收发,发送数据时只需要数据写入 buff原创 2016-12-11 17:34:50 · 2345 阅读 · 0 评论 -
25、USART 的 DMA 模式
在上一篇中介绍了 ringbuffer 方式去实现串口收发数据的无阻塞。这里介绍另外一种实现方式 - DMA 模式,个人感觉使用 DMA 方式在接收数据时不仅更为方便,解析帧协议更为准确(尤其是不定长帧协议),而且占用 CPU 资源也更小。在 ringbuffer 方式下,收发数据都是基于中断实现的,因此在大数据量进行传输时,频繁的进中断会导致系统的性能急剧下降。使用 DMA 模式在整原创 2016-12-11 17:59:21 · 1148 阅读 · 0 评论 -
26、STM32 的时钟
参考文章 :http://blog.youkuaiyun.com/kevinhg/article/details/17517117关于 STM32 的时钟, 一共有 5 个时钟源 : HSI、HSE、LSI、LSE、PLL1、 HSI :高速内部时钟, RC 振荡器, 频率为 8MHz2、 HSE :高速外部时钟, 可接石英/陶瓷谐振器, 或者接外部时钟源, 频率范围4~16M3、 L原创 2016-12-11 18:30:24 · 372 阅读 · 0 评论 -
18、基于 STM32 的 I2C 时序 - GPIO 模拟方式
STM32 的硬件 I2C 一直存在着一些问题,在使用的过程中容易出现死锁的现象。因此在大多数场合下,我们都会抛弃硬件 I2C,改用 GPIO 模拟的方式去实现。这里通过模拟 I2C 的时序去读写 AT24C02, 从而也能更为深刻的了解 I2C 的时序。 I2C 的时序产生代码如下 :/* SCL 设置为高电平 */void SetSCLHigh(void) { GPIO_Set原创 2016-12-01 22:34:30 · 1121 阅读 · 1 评论 -
19、基于 STM32 的 DS18B20 温度读取
DS18B20 的内部光刻 ROM 中有 64 位序列号, 开始 8 位(28H)是产品类型标号, 接着的 48 位是自身的序列号,最后 8 位是前面 56 位的循环冗余校验码。该传感器可编程为 9、10、11、12 位精度,分别以0.5℃、0.25℃、0.125℃、0.0625℃增量递增,上电默认是 12 位。 12 位的数据转换完之后保存在两个 8 位的 RAM 中, 高字节的前原创 2016-12-01 22:45:00 · 9577 阅读 · 0 评论 -
20、基于 STM32 的 SPI 通讯
STM32 的 SPI 通信比较简单,跟其他外设一样,首先进行一系列的配置,然后就可以进行数据收发了。SPI 总线是全双工协议,因此可以同时进行收发,SPI 的通信速率可以高达 20MHz,也可以配置为 DMA 模式。因此是一个很重要的通讯总线。初始化代码如下 :void SPI_Config(void){ SPI_InitTypeDef SPI_InitStru原创 2016-12-01 23:01:03 · 921 阅读 · 0 评论 -
1、关于 STM32 的启动模式
系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过BOOT[1:0]引脚选择三种不同的启动模式。 从待机状态退出模式时,BOOT引脚的值将被重新锁存。因此在待机模式下BOOT引脚应该保持为需要的启动配置。在启动延迟之后,CPU从地址0x0000获取堆栈顶的地址,并从启动存储器的0x0004指示的地址开始执行代码。 因为固定的存储器映像,代码区始终从地原创 2016-11-27 11:38:08 · 1102 阅读 · 0 评论 -
17、基于 STM32 的 Flash 操作
STM32 的内部 Flash 除了可以用来烧录程序之外,还可以在程序中进行访问。有两点需要注意 :1、对 Flash 进行操作之前,必须解锁,访问结束必须上锁2、对 Flash 进行写操作时要注意地址,不要跟代码的地址冲突,否则会导致系统运行异常。原因很简单,如果在 程序中将存放代码的 Flash 区域的数据修改了,必然导致程序被修改,从而导致程序运行异常。因此在操作之原创 2016-11-30 23:14:24 · 490 阅读 · 0 评论 -
16、STM32 窗口看门狗的使用
窗口看门狗与独立看门狗不同,只能在设定的窗口时间内进行喂狗,不过在复位之前,窗口看门狗可以产生一个中断,因此可以在中断里进行喂狗。使用流程如下 :l、使能窗口看门狗时钟2、中断配置、尽量配置为高优先级3、窗口看门狗配置A、设置预分频 WWDG_SetPrescalerB、设置窗口的上边界值 WWDG_SetWindowValueC、使能窗口看门狗、并设置计数器初值 WWDG原创 2016-11-30 23:03:13 · 467 阅读 · 0 评论 -
4、STM32 外部中断的使用
STM32 拥有大量的外部中断资源, 可以映射到不同的 GPIO 端口, 使用非常灵活。外部中断的使用流程主要包含时钟使能、GPIO 配置,中断优先级配置,中断服务程序等。这里关于STM32中断优先级的问题,由于STM32的中断优先级具有分不同组, 有抢占优先级与响应优先级, 这里暂时不进行深入的讲解,后面会单独再详细讲解。这里只是示例外部中断的使用流程 1、初始化时钟 在使用原创 2016-11-27 13:07:48 · 872 阅读 · 0 评论 -
6、STM32 的 PWM 输出
STM32 的定时器除了 TIM6 和 TIM7 之外, 其他的定时器都可以用来产生 PWM 输出。其中高级定时器TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出,这样STM32 最多可以同时产生 30 路 PWM 输出。 定时器都有对应的 GPIO 端口映射, 不同的映射方式对应不同的端口号,需查阅数据手册。l原创 2016-11-27 13:41:02 · 815 阅读 · 0 评论 -
8、STM32 CAN 总线的使用
CAN 总线是一种在汽车领域常见的通讯协议总线。STM32 支持 CAN 协议。这里简单的对 STM32 平台上 CAN 总线的使用做一个示例,起到抛砖引玉的作用。首先明确一个概念 :CAN 总线中不是以时钟或者逻辑电平来表示'0'和'1'的,而是采用隐性位和显性位来表示 :l、隐性位与显性位 CAN总线为”隐性”(逻辑1)时, CAN_H 和 CAN_L的电平为2.5V(电位差为0V原创 2016-11-28 22:25:11 · 1650 阅读 · 0 评论 -
9、STM32 的 ADC 转换器
STM32的ADC转换器是一种12位逐次逼近型的转换器。输入时钟不能超过 14MHz。l、时钟配置A、初始化系统时钟B、使能对应 GPIO 端口时钟、使能 ADC 时钟、使能端口复用时钟。 ADC时钟不能超过14MHz,因此需要进行ADC时钟分频。 RCC_ADCCLKConfig(RCC_PCLK2_Div6);2、GPIO端口初始化 配置管脚为模原创 2016-11-28 22:39:01 · 478 阅读 · 0 评论 -
7、STM32 的串口编程(printf 重定向)
在开发过程中,通常需要进行一些必要的 log 输出,在代码的关键地方输出 log 便于我们 DEBUG,也便于跟踪程序的运行状态, 最根本的方法就是通过串口输出。STM32 的串口资源比较丰富, 使用流程如下 :l 配置时钟Ø 初始化系统时钟 SystemInit();Ø 使能串口映射到的GPIO端口时钟 RCC_APB2PeriphClockCmd(RCC原创 2016-11-27 13:48:50 · 815 阅读 · 0 评论 -
13、STM32 的低功耗模式
STM32 可以设置为睡眠模式、待机模式等。不同的模式下,开启的外设(仍然能响应的外设)是不同的,并且唤醒的条件也不一样,在实际的应用中,需要根据具体的情况去选择一个合适的低功耗模式。这里简单的介绍一下待机模式 - 深度睡眠模式配置函数如下 :void Sys_Standby(void){ /* 系统低功耗配置为待机模式(深度睡眠模式) */ NVIC_原创 2016-11-29 22:47:17 · 509 阅读 · 0 评论 -
10、STM32 的 DAC 转换
STM32 有一旦使能 DACx 通道,相应的 GPIO 引脚就会自动与 DAC 的模拟输出相连。为了避免寄生的干扰和额外的功耗,相应的 GPIO 引脚在初始化之前应该设置为模拟输入模式。DAC 的配置流程如下 :l、时钟设置A、初始化系统时钟B、使能GPIO端口时钟C、使能DAC时钟D、使能端口复用时钟2、GPIO端口设置A、定义端口配置结构体B、设置端口为模拟输原创 2016-11-30 22:28:16 · 1315 阅读 · 0 评论 -
11、STM32 的 DMA 使用 - ADC 采用 DMA 模式
STM32 的很多外设可以配置为 DMA 模式,可以大大提高效率,减轻 CPU 的负担。例如前面提到过的 ADC 转换,如果采用中断模式,由于 ADC 转换速度快,因此进入中断就很频繁,从而占用 CPU 资源严重,如果采用查询的方式去读取 ADC,在某些要求高速的场合实时性会降低。因此可以采用 DMA 模式进行 ADC 转换。STM32 的 DMA 配置流程如下 :l、时钟设置A、初始化系原创 2016-11-29 22:23:40 · 2547 阅读 · 0 评论 -
12、STM32 的 RTC 使用
STM32 的 RTC 使用需要注意一下几点 : 必须设置 RTC_CRL 寄存器中的 CNF 位, 使 RTC 进入配置模式后, 才能写入 RTC_PRL、RTC_CNT、RTC_ALR 寄存器。 另外, 对 RTC 任何寄存器的写操作, 都必须在前一次写操作结束后才进行。可以通过查询 RTC_CR 寄存器中的 RTOFF 状态位判断 RTC 寄存器是否处于更新中。仅当 R原创 2016-11-30 22:29:37 · 432 阅读 · 0 评论 -
14、STM32 CPU 内部温度采集
STM32 的 ADC 通道 16 可以用于采集芯片内部温度,使用方式与常规 ADC 差别不大,多了一个内部温度采集使能。使用流程如下 :1、选择通道ADC_Channel_162、使能内部温度采集 ADC_TempSensorVrefintCmd(ENABLE);3、剩下初始化流程与常规 ADC 采样初始化一致4、温度计算,采用如下公式计算 temp = (1.43原创 2016-11-30 22:34:30 · 7346 阅读 · 2 评论 -
15、STM32 独立看门狗的使用
STM32 内部有两个看门狗,一个独立看门狗,一个窗口看门狗。这里先介绍独立看门狗。 独立看门狗的使用流程如下 :l、独立看门狗配置 /* 使能寄存器访问 :向IWDG_KR 寄存器写入0x5555 */ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 设置预分频 :4原创 2016-11-30 22:39:31 · 381 阅读 · 0 评论 -
3、STM32 GPIO 基本操作
STM32 GPIO 的操作主要包含以下几个步骤 :1、时钟初始化 时钟初始化包括系统时钟初始化与 GPIO 端口时钟使能。其中初始化系统时钟,有两种方式 :使用SystemInit()函数初始化为 72 MHz。或者根据前面章节讲解的方式自己去配置时钟大小。 使能GPIO端口的时钟, 可以根据数据手册,配置相关寄存器,或者直接使用库函数的方式。 RCC_APB2Per原创 2016-11-27 12:01:34 · 969 阅读 · 0 评论