目录

LibOpenCM3 时钟, RCC

LibOpenCM3 提供了快捷方法用于初始化系统时钟

旧版本的系统时脉初始化

  1. rcc_clock_setup_in_hse_8mhz_out_72mhz();

方法所在文件lib/stm32/f1/rcc.c, 对应板载晶振为8MHz, 需要设置为72MHz系统频率的应用. 这个文件下还提供了其它的快捷方法

  1. // 使用内部RC产生64MHz
  2. void rcc_clock_setup_in_hsi_out_64mhz(void)
  3. // 使用内部RC产生48MHz
  4. void rcc_clock_setup_in_hsi_out_48mhz(void)
  5. // 使用内部RC产生24MHz
  6. void rcc_clock_setup_in_hsi_out_24mhz(void)
  7. // 以下是使用外部晶振的方法
  8. void rcc_clock_setup_in_hse_8mhz_out_24mhz(void)
  9. void rcc_clock_setup_in_hse_8mhz_out_72mhz(void)
  10. void rcc_clock_setup_in_hse_12mhz_out_72mhz(void)
  11. void rcc_clock_setup_in_hse_16mhz_out_72mhz(void)
  12. void rcc_clock_setup_in_hse_25mhz_out_72mhz(void)

使用时直接调用就可以了, 例如

  1. int main(void)
  2. {
  3. rcc_clock_setup_in_hse_8mhz_out_72mhz();
  4. gpio_setup();
  5. tim_setup();
  6. while (1)
  7. {
  8. //...
  9. }
  10. return 0;
  11. }

非常方便

新版本的系统时脉初始化

在最新的版本中, 原来的方法还能调用, 但是已经被标为Deprecated了, 编译会产生warning提示. 需要改为下面的调用方式

  1. rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);

定义的文件位置没变, 对应的频率放到了参数里

  1. enum rcc_clock_hsi {
  2. RCC_CLOCK_HSI_24MHZ,
  3. RCC_CLOCK_HSI_48MHZ,
  4. RCC_CLOCK_HSI_64MHZ,
  5. RCC_CLOCK_HSI_END
  6. };
  7. enum rcc_clock_hse {
  8. RCC_CLOCK_HSE12_72MHZ,
  9. RCC_CLOCK_HSE16_72MHZ,
  10. RCC_CLOCK_HSE25_72MHZ,
  11. RCC_CLOCK_HSE8_24MHZ,
  12. RCC_CLOCK_HSE8_72MHZ,
  13. RCC_CLOCK_HSE_END
  14. };

LibOpenCM3 GPIO

GPIO的设置与SPL/HAL流程是一样的, 只是函数名和常量名有些区别.

开启GPIO外设时钟

  1. rcc_periph_clock_enable(RCC_GPIOC);

设置GPIO模式

  1. gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO8);
  2. gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO9);
  3. // 可以简化为
  4. 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

输出模式设置

  1. gpio_set_output_options(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_LOW, GPIO8);
  2. gpio_set_output_options(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_LOW, GPIO9);
  3. // 可以简化为
  4. 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就处于工作状态, 这时候可以设置输出电平

  1. gpio_set(GPIOC, GPIO8);
  2. gpio_set(GPIOC, GPIO9);
  3. // 可以简化为
  4. gpio_set(GPIOC, GPIO8 | GPIO9);

LibOpenCM3 定时器

不同MCU型号, 能使用的定时器编号不一样, 需要根据手册确定, 下面以TIM2为例说明定时器的设置流程

开启TIM2外设时钟

开启TIM2时钟

  1. /* Enable TIM2 clock. */
  2. rcc_periph_clock_enable(RCC_TIM2);

如果需要初始化(重置)

  1. /* Reset TIM2 peripheral to defaults. */
  2. rcc_periph_reset_pulse(RST_TIM2);

设置定时器工作模式

  1. timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);

参数一: 分频系数

  1. /* CKD[1:0]: Clock division */
  2. #define TIM_CR1_CKD_CK_INT (0x0 << 8)
  3. #define TIM_CR1_CKD_CK_INT_MUL_2 (0x1 << 8)
  4. #define TIM_CR1_CKD_CK_INT_MUL_4 (0x2 << 8)
  5. #define TIM_CR1_CKD_CK_INT_MASK (0x3 << 8)

参数二: 对齐方式

  1. /* CMS[1:0]: Center-aligned mode selection */
  2. /****************************************************************************/
  3. /** @defgroup tim_x_cr1_cms TIMx_CR1 CMS[1:0]: Center-aligned Mode Selection
  4. @{*/
  5. #define TIM_CR1_CMS_EDGE (0x0 << 5)
  6. #define TIM_CR1_CMS_CENTER_1 (0x1 << 5)
  7. #define TIM_CR1_CMS_CENTER_2 (0x2 << 5)
  8. #define TIM_CR1_CMS_CENTER_3 (0x3 << 5)
  9. #define TIM_CR1_CMS_MASK (0x3 << 5)

参数三: 计数方向

  1. /* DIR: Direction */
  2. /****************************************************************************/
  3. /** @defgroup tim_x_cr1_dir TIMx_CR1 DIR: Direction
  4. @{*/
  5. #define TIM_CR1_DIR_UP (0 << 4)
  6. #define TIM_CR1_DIR_DOWN (1 << 4)

设置定时系数

  1. // 禁用 preload
  2. timer_disable_preload(TIM2);
  3. // 循环模式
  4. timer_continuous_mode(TIM2);
  5. // 预分频系数, 根据当前所在总线计算分频后的周期
  6. timer_set_prescaler(TIM2, 36000);
  7. // 计数周期
  8. timer_set_period(TIM2, 1000);

如果要设置中断

  1. /* Enable TIM2 interrupt. */
  2. nvic_enable_irq(NVIC_TIM2_IRQ);
  3. /* Enable Channel 1 compare interrupt to recalculate compare values */
  4. timer_enable_irq(TIM2, TIM_DIER_CC1IE);

启用(使能)TIM2

  1. /* Counter enable. */
  2. timer_enable_counter(TIM2);

完整例子

使用GPIO和定时器外设的例子, 参考 LibOpenCM3(一) Linux下命令行开发环境配置 中的演示示例

LibOpenCM3(五) 基础功能: 系统时钟, GPIO, 定时器的更多相关文章

  1. JZ2440 裸机驱动 第10章 系统时钟和定时器

    本章目标      了解S3C2410/S3C2440的时钟体系结构     掌握通过设置MPLL改变系统时钟的方法     掌握在不同的频率下设置存储控制器的方法     掌握PWM定时器的用法   ...

  2. 实时时钟、系统时钟和CPU时钟的区别

    http://blog.sina.com.cn/s/blog_68f909c30100pli7.html 实时时钟:RTC时钟,用于提供年.月.日.时.分.秒和星期等的实时时间信息,由后备电池供电,当 ...

  3. STM32学习笔记:系统时钟和SysTick定时器

    原文:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html 1.     STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HS ...

  4. 单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟

    N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c #includ ...

  5. MES系统之设备管理的基础功能

    设备是制造企业进行生产的主要物质技术基础,制造企业的生产率.产品质量.生产成本都与设备直接相关.因此,正确使用.定时保养.及时检修维护设备,并对设备的运行性能进行分析,使设备处于良好的状态,才能保证企 ...

  6. 使用Typescript重构axios(五)——实现基础功能:处理请求的header

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. 基于STC12C5A的MINI3216多功能点阵时钟

    代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...

  8. STM32之系统时钟

    转载:http://www.openedv.com/posts/list/302.htm 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32. ...

  9. STM32(4)——系统时钟和SysTick

    1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...

随机推荐

  1. 品味Spring Cache设计之美

    最近负责教育类产品的架构工作,两位研发同学建议:"团队封装的Redis客户端可否适配Spring Cache,这样加缓存就会方便多了" . 于是边查阅文档边实战,收获颇丰,写这篇文 ...

  2. 【刷题-PAT】A1135 Is It A Red-Black Tree (30 分)

    1135 Is It A Red-Black Tree (30 分) There is a kind of balanced binary search tree named red-black tr ...

  3. deepin20体验

    现在Ubuntu20吊打deepin20 100条街.撑了20天受不了deepin 优点 开机启动设置简单,即使不是应用商店的应用也很好 deepin仓库不用代理也很快.,而且有些Ubuntu下载不了 ...

  4. 多线程-停止线程方式-Interrupt

    1 package multithread4; 2 /* 3 * 停止线程: 4 * 1,stop方法. 5 * 6 * 2,run方法结束. 7 * 8 * 怎么控制线程的任务结束呢? 9 * 任务 ...

  5. Android 12(S) 图形显示系统 - SurfaceFlinger的启动和消息队列处理机制(四)

    1 前言 SurfaceFlinger作为Android图形显示系统处理逻辑的核心单元,我们有必要去了解其是如何启动,初始化及进行消息处理的.这篇文章我们就来简单分析SurfaceFlinger这个B ...

  6. html+css+js(登录页)

    直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. Android开发----Button组件的使用与练习

    Button 学习目标: 文字大小.颜色 自定义背景形状 自定义按压效果 点击事件 创建一个新的Activity以增加控件 1.文字大小.颜色 直接在xml文件中定义即可 <Button and ...

  8. 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...

  9. 使用Xamarin开发移动应用示例——数独游戏(六)使用数据库

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 现在我们希望为应用增加更多的功能,比如记录每个完成的游戏,可以让用户自己添加 ...

  10. 不使用pvc的方式在K8S中部署apisix-gateway

    不使用pvc的方式在K8S中部署apisix-gateway 简介 我的apisix使用etcd作为数据存储服务器,官方的使用pvc方式或者docker-compose的方式,对于新手不太友好,本篇是 ...