LibOpenCM3(五) 基础功能: 系统时钟, GPIO, 定时器
目录
- LibOpenCM3(一) Linux下命令行开发环境配置
- LibOpenCM3(二) 项目模板 Makefile分析
- LibOpenCM3(三) .ld文件(连接器脚本)和startup代码说明
- LibOpenCM3(四) VSCode IDE 环境配置
- LibOpenCM3(五) 基础功能: 系统时钟, GPIO, 定时器
LibOpenCM3 时钟, RCC
LibOpenCM3 提供了快捷方法用于初始化系统时钟
旧版本的系统时脉初始化
rcc_clock_setup_in_hse_8mhz_out_72mhz();
方法所在文件lib/stm32/f1/rcc.c, 对应板载晶振为8MHz, 需要设置为72MHz系统频率的应用. 这个文件下还提供了其它的快捷方法
// 使用内部RC产生64MHz
void rcc_clock_setup_in_hsi_out_64mhz(void)
// 使用内部RC产生48MHz
void rcc_clock_setup_in_hsi_out_48mhz(void)
// 使用内部RC产生24MHz
void rcc_clock_setup_in_hsi_out_24mhz(void)
// 以下是使用外部晶振的方法
void rcc_clock_setup_in_hse_8mhz_out_24mhz(void)
void rcc_clock_setup_in_hse_8mhz_out_72mhz(void)
void rcc_clock_setup_in_hse_12mhz_out_72mhz(void)
void rcc_clock_setup_in_hse_16mhz_out_72mhz(void)
void rcc_clock_setup_in_hse_25mhz_out_72mhz(void)
使用时直接调用就可以了, 例如
int main(void)
{
rcc_clock_setup_in_hse_8mhz_out_72mhz();
gpio_setup();
tim_setup();
while (1)
{
//...
}
return 0;
}
非常方便
新版本的系统时脉初始化
在最新的版本中, 原来的方法还能调用, 但是已经被标为Deprecated了, 编译会产生warning提示. 需要改为下面的调用方式
rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);
定义的文件位置没变, 对应的频率放到了参数里
enum rcc_clock_hsi {
RCC_CLOCK_HSI_24MHZ,
RCC_CLOCK_HSI_48MHZ,
RCC_CLOCK_HSI_64MHZ,
RCC_CLOCK_HSI_END
};
enum rcc_clock_hse {
RCC_CLOCK_HSE12_72MHZ,
RCC_CLOCK_HSE16_72MHZ,
RCC_CLOCK_HSE25_72MHZ,
RCC_CLOCK_HSE8_24MHZ,
RCC_CLOCK_HSE8_72MHZ,
RCC_CLOCK_HSE_END
};
LibOpenCM3 GPIO
GPIO的设置与SPL/HAL流程是一样的, 只是函数名和常量名有些区别.
开启GPIO外设时钟
rcc_periph_clock_enable(RCC_GPIOC);
设置GPIO模式
gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO8);
gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO9);
// 可以简化为
gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO8 | GPIO9);
输入输出模式选项
- GPIO_MODE_INPUT (default) Digital input
- GPIO_MODE_OUTPUT Digital output
- GPIO_MODE_AF Alternate Function (requires defining which alternate function desired)
- GPIO_MODE_ANALOG Analog (for use with ADC or DAC capable GPIO)
上下拉电阻选项
- GPIO_PUPD_NONE (default) No internal pull-up or pull-down resistor
- GPIO_PUPD_PULLUP Internal pull-up resistor
- GPIO_PUPD_PULLDOWN Internal pull-down resistor
输出模式设置
gpio_set_output_options(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_LOW, GPIO8);
gpio_set_output_options(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_LOW, GPIO9);
// 可以简化为
gpio_set_output_options(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_LOW, GPIO8 | GPIO9);
输出类型
- GPIO_OTYPER_PP (default) Push-pull “totem pole” output
- GPIO_OTYPER_OD Open-drain output
输出速度
- GPIO_OSPEED_HIGH High output speed
- GPIO_OSPEED_MED Medium output speed
- GPIO_OSPEED_LOW (default) Low output speed
- GPIO_OSPEED_100MHZ Up to 100MHz output speed (equivalent to high)
- GPIO_OSPEED_50MHZ Up to 50MHz output speed
- GPIO_OSPEED_25MHZ Up to 25MHz output speed (equivalent to medium)
- GPIO_OSPEED_2MHZ Up to 2MHz output speed (equivalent to low)
设置状态
GPIO 没有开启或者关闭的操作, 开启时钟后GPIO就处于工作状态, 这时候可以设置输出电平
gpio_set(GPIOC, GPIO8);
gpio_set(GPIOC, GPIO9);
// 可以简化为
gpio_set(GPIOC, GPIO8 | GPIO9);
LibOpenCM3 定时器
不同MCU型号, 能使用的定时器编号不一样, 需要根据手册确定, 下面以TIM2为例说明定时器的设置流程
开启TIM2外设时钟
开启TIM2时钟
/* Enable TIM2 clock. */
rcc_periph_clock_enable(RCC_TIM2);
如果需要初始化(重置)
/* Reset TIM2 peripheral to defaults. */
rcc_periph_reset_pulse(RST_TIM2);
设置定时器工作模式
timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
参数一: 分频系数
/* CKD[1:0]: Clock division */
#define TIM_CR1_CKD_CK_INT (0x0 << 8)
#define TIM_CR1_CKD_CK_INT_MUL_2 (0x1 << 8)
#define TIM_CR1_CKD_CK_INT_MUL_4 (0x2 << 8)
#define TIM_CR1_CKD_CK_INT_MASK (0x3 << 8)
参数二: 对齐方式
/* CMS[1:0]: Center-aligned mode selection */
/****************************************************************************/
/** @defgroup tim_x_cr1_cms TIMx_CR1 CMS[1:0]: Center-aligned Mode Selection
@{*/
#define TIM_CR1_CMS_EDGE (0x0 << 5)
#define TIM_CR1_CMS_CENTER_1 (0x1 << 5)
#define TIM_CR1_CMS_CENTER_2 (0x2 << 5)
#define TIM_CR1_CMS_CENTER_3 (0x3 << 5)
#define TIM_CR1_CMS_MASK (0x3 << 5)
参数三: 计数方向
/* DIR: Direction */
/****************************************************************************/
/** @defgroup tim_x_cr1_dir TIMx_CR1 DIR: Direction
@{*/
#define TIM_CR1_DIR_UP (0 << 4)
#define TIM_CR1_DIR_DOWN (1 << 4)
设置定时系数
// 禁用 preload
timer_disable_preload(TIM2);
// 循环模式
timer_continuous_mode(TIM2);
// 预分频系数, 根据当前所在总线计算分频后的周期
timer_set_prescaler(TIM2, 36000);
// 计数周期
timer_set_period(TIM2, 1000);
如果要设置中断
/* Enable TIM2 interrupt. */
nvic_enable_irq(NVIC_TIM2_IRQ);
/* Enable Channel 1 compare interrupt to recalculate compare values */
timer_enable_irq(TIM2, TIM_DIER_CC1IE);
启用(使能)TIM2
/* Counter enable. */
timer_enable_counter(TIM2);
完整例子
使用GPIO和定时器外设的例子, 参考 LibOpenCM3(一) Linux下命令行开发环境配置 中的演示示例
LibOpenCM3(五) 基础功能: 系统时钟, GPIO, 定时器的更多相关文章
- JZ2440 裸机驱动 第10章 系统时钟和定时器
本章目标 了解S3C2410/S3C2440的时钟体系结构 掌握通过设置MPLL改变系统时钟的方法 掌握在不同的频率下设置存储控制器的方法 掌握PWM定时器的用法 ...
- 实时时钟、系统时钟和CPU时钟的区别
http://blog.sina.com.cn/s/blog_68f909c30100pli7.html 实时时钟:RTC时钟,用于提供年.月.日.时.分.秒和星期等的实时时间信息,由后备电池供电,当 ...
- STM32学习笔记:系统时钟和SysTick定时器
原文:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html 1. STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HS ...
- 单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟
N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c #includ ...
- MES系统之设备管理的基础功能
设备是制造企业进行生产的主要物质技术基础,制造企业的生产率.产品质量.生产成本都与设备直接相关.因此,正确使用.定时保养.及时检修维护设备,并对设备的运行性能进行分析,使设备处于良好的状态,才能保证企 ...
- 使用Typescript重构axios(五)——实现基础功能:处理请求的header
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 基于STC12C5A的MINI3216多功能点阵时钟
代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...
- STM32之系统时钟
转载:http://www.openedv.com/posts/list/302.htm 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32. ...
- STM32(4)——系统时钟和SysTick
1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...
随机推荐
- Redis之持久化方式详解
背景:Redis之所以能够在技术革新发展迅速的时代超越Memcache等其他Nosql数据库,最主要的一点是Redis提供数据持久化,能够根据持久化策略将缓存数据灵活的写到磁盘上,更好地满足了当下海量 ...
- GeoServer介绍
GeoServer本质上是一个地图服务器,它是遵循OpenGIS Web 服务器规范的J2EE实现,通过它可以方便的将地图数据发布为地图服务,实现地理空间数据在用户之间的共享.另外,它也提供了相应的接 ...
- Vulnhub - THE PLANETS: EARTH
环境配置 从www.vulnhub.com下载靶机,在VMware中导入,自动分配IP 主机发现 通过对内网主机的扫描,VMware为目标主机 端口扫描 使用nmap对主机进行扫描 发现443端口信息 ...
- [CISCN2019 华东南赛区]Web11
[CISCN2019 华东南赛区]Web11 写在前面 参考文章:Smarty SSTI 1.{php}{/php} Smarty已经废弃{php}标签,强烈建议不要使用.在Smarty 3.1,{p ...
- Javascript面向对象——创建对象、构造函数的原型
Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...
- unity3d C# soket客户端接受失败
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using S ...
- Natasha 4.0 探索之路系列(二) "域"与插件
域与ALC 在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题, 能不能兼容 AppDomain, 如何使用 AppDomain, 为什么 CoreAPI 阉割了 AppDomain 等一系 ...
- 推荐一个github国内访问加速神器GitHub520
一.介绍 对 GitHub 说"爱"太难了:访问慢.图片加载不出来. 注: 本项目还处于测试阶段,仅在本机测试通过,如有问题欢迎提 issues 本项目无需安装任何程序,通过修改本 ...
- 前端基础之javaScript(基本类型-布尔值数组-if-while)
目录 一:javaScript基本数据类型 1.字符串类型常用方法 2.返回长度 3.移出空白 4.移除左边的空白 5.移出右边的空格 6.返回第n个字符 7.子序列位置 8.根据索引获取子序列 9. ...
- ☕【Java深层系列】「并发编程系列」深入分析和研究MappedByteBuffer的实现原理和开发指南
前言介绍 在Java编程语言中,操作文件IO的时候,通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于Mapp ...