用中断实现流水灯

2023-05-16

#include <stm32f4xx.h>

#define GPIO_Pin_6                 0x0040  /* LED2 */
#define GPIO_Pin_7   0x0080  /* LED1 */
#define PLL_M 8
#define PLL_N 336
#define PLL_P 2
#define PLL_Q 7

uint32_t flag = 0;

int main()
{
RCC_config();
TIMER_config();
GPIO_config();
NVIC_config();

while(1)
{
;
}

}


// 中断函数处理
void TIM4_IRQHandler(void)
{  
if((TIM4->SR&TIM_SR_UIF)){
flag = !flag;
// 清除标志位
CLEAR_BIT(TIM4->SR, TIM_SR_UIF); 
if(flag == 0){  
// LED2亮,LED1灭
GPIOG->ODR &= ~GPIO_Pin_6;  
GPIOG->ODR |= GPIO_Pin_7;  
}
if(flag == 1){
// LED1亮,LED2灭
GPIOG->BSRRL |= GPIO_Pin_6;
GPIOG->BSRRH |= GPIO_Pin_7;
}
}

}


void RCC_config(void)
{
// -------------------- 配置HSE时钟 -------------------- 
// 配置PLL预分频
RCC->PLLCFGR= 0x00000000;  // 将该寄存器默认值初始化为零
RCC->PLLCFGR|= PLL_M;
RCC->PLLCFGR|= PLL_N<<6;
RCC->PLLCFGR|= (PLL_P/2-1)<<16;
RCC->PLLCFGR|= PLL_Q<<24;
// 打开HSE晶振
SET_BIT(RCC->CR, RCC_CR_HSEON);
// 等待HSE晶振进入稳定状态
while(!(RCC->CR&RCC_CR_HSERDY)){
;
}
// 配置AHB预分频
SET_BIT(RCC->CFGR, RCC_CFGR_HPRE_DIV1);
// 配置APB1预分频,得到84M的时钟频率
SET_BIT(RCC->CFGR, RCC_CFGR_PPRE1_DIV4);
// 配置APB2预分频
SET_BIT(RCC->CFGR, RCC_CFGR_PPRE2_DIV2);
// 将HSE作为PLLCLK的输入
SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC_HSE);
// 使能PLLCLK
SET_BIT(RCC->CR, RCC_CR_PLLON);
// 等待PLLCLK稳定
while(!(RCC->CR&RCC_CR_PLLRDY)){
;
}
// 正确设置FLASH延迟时间
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
// 检查设置是否成功
if((FLASH->ACR & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_5WS){
;
}
// 将PLLCLK作为SYSCLK,关闭HSI
SET_BIT(RCC->CFGR, RCC_CFGR_SW_PLL);
CLEAR_BIT(RCC->CR, RCC_CR_HSION);
// 等待设置成功
while((RCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL){
;
}
}

void TIMER_config(void)
{
// -------------------- 配置定时器 -------------------- 
// 打开TIM4时钟
RCC->APB1ENR|= RCC_APB1ENR_TIM4EN;
// 设置预分频值,对84M进行8400分频,得到10k的计数器时钟频率
TIM4->PSC= 8399;
// 设置自动重载值,定时器频率为1s
TIM4->ARR= 10000;
// 设置计数模式,向上计数
CLEAR_BIT(TIM4->CR1, TIM_CR1_DIR);
// 清空计数器的值
TIM4->CNT= 0;
// 中断使能
TIM4->DIER|= TIM_DIER_UIE;
// 自动重装载预装载使能
SET_BIT(TIM4->CR1, TIM_CR1_ARPE);
// 打开定时器4
SET_BIT(TIM4->CR1, TIM_CR1_CEN); 
}

void NVIC_config(void)

// TIM4全局中断
NVIC->ISER[0]|= 1<<30;
}

void GPIO_config(void)
{
// -------------------- 配置GPIO -------------------- 
// 打开G端口的时钟
RCC->AHB1ENR|= RCC_AHB1ENR_GPIOGEN;
// 输出模式
GPIOG->MODER|= GPIO_MODER_MODER6_0;
GPIOG->MODER|= GPIO_MODER_MODER7_0;
// 有上拉电阻,开漏输出
GPIOG->OTYPER|= GPIO_OTYPER_OT_6;
GPIOG->OTYPER|= GPIO_OTYPER_OT_7;
// 中等速度
GPIOG->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR6_0;
GPIOG->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR7_0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用中断实现流水灯 的相关文章

  • CCF-CSP考试介绍以及复习技巧指导

    CCF CSP考试时间及费用 时间一般是每年3 9 12月的中旬 xff0c 报名时间一般也是提前一个月 xff0c 不固定 非计算机协会会员300元 次 xff0c 会员180元 次 xff08 学生会员需缴纳50元 年的会费 xff09
  • 知根知底:Flink-KafkaConsumer 详解

    Flink Kafka Connector 是连接kafka 的连接器 xff0c 负责对接kafka 的读写 xff0c 本篇主要介绍kafka consumer 的执行流程与核心设计 逻辑执行流程 分配当前task消费的partitio
  • debian下添加环境变量

    1 添加临时环境变量方法 xff1a export PATH 61 PATH usr local 你的环境变量路径 2 添加永久环境变量 cd 打开文件 gedit bashrc 在 bashrc文件末尾添加如下 xff1a PATH 61
  • STM32F407学习笔记——GPIO_按键控制LED亮灭

    include lt stm32f4xx h gt include 34 stm32f4xx conf h 34 include 34 delay h 34 GPIO TypeDef io led 61 GPIOC 定义一个指向结构体 sp
  • ARM 安装中文输入法

    TX2 为嵌入式开发板 xff0c 系统架构为ARM xff0c 普通的PC上的Linux系统安装中文输入法的方法不适用 xff0c 所以这里提供ARM上的中文输入法的安装方法 步骤1 xff1a 打开终端 xff0c 输入以下命令 sud
  • ElasticSearch基础、分布式架构及读写流程

    ElasticSearch 文章目录 ElasticSearch基础概念IndexTypeMapperDocumentField 读取中的概念getqueryfilter DSL 分布式架构名词概念primary shardreplica
  • Deepin下apt安装node.js和npm

    写在前面 折腾了一下午 xff0c 发现怎么装node js和npm都不能安装上 xff0c 也不能使用命令 xff0c 开始以为是官方源版本太老 xff0c 后来换了阿里源也是一样 root 64 baike PC home baike
  • windows下,vscode配合pyenv-win使用python虚拟环境

    vscode安装python插件 安装pyenv win xff0c 推荐使用chocolatey安装 pyenv安装需要的python版本 xff0c 安装后需要pyenv rehash 创建工程文件夹 在文件夹中输入 pyenv loc
  • 关于独立版ASIO库在不同编译器下的几个使用问题

    window平台 一 在VS2019中使用 VS2019 使用微软自己的MSVC编译器 xff0c 只需要在工程项目属性中 加入2个预编译宏定义项 xff1a WIN32 WINNT span class token operator 61
  • Vue系列之单文件组件

    文章目录 前言一 什么是单文件组件 xff1f 二 单文件组件的结构三 如何引入并使用单文件组件1 B组件中需导出 xff08 export xff09 2 A组件中需导入并局部注册B xff08 import xff09 前言 Vue应用
  • 记录一个js自动批量导入模块的方法require.context()

    应用场景 在vuex中分模块管理全局数据时 xff0c 不用手动一个一个的导出 span class token keyword const span files span class token operator 61 span requ
  • 可截取签名

    可截取签名 定义 可截取签名 xff08 Content Extraction Signature CES xff09 的概念出现于 2001 年 xff0c 由一位名叫 Steinfeld 的学者提出1 可截取签名的特点在于 xff0c
  • 关于最新版win10下,vscode不能离线启动的解决方案

    问题描述 xff1a 双击vscode图标 xff0c 发现程序不能启动 xff0c 使用cmd输入code后提示 xff1a dns js 246 this handle 61 new ChannelWrap Error EFILE at
  • Docker Desktop for Windows(WSL 2 方式)数据卷位置和访问

    Docker Desktop for Windows 运行容器后发现 xff0c 挂载的卷并不是windows本地的文件 xff0c 后来发现在wsl2方式下 xff0c windows上的docker是运行在Windows10中的linu
  • windows10 安装 docker 基于 WSL 2

    Docker Desktop安装 下载Docker Desktop 下载 Docker Desktop Stable 2 3 0 2 或更高版本 https hub docker com editions community docker
  • frp内网穿透原理及配置应用

    1 Frp介绍 frp 是一个专注于内网穿透的高性能的反向代理应用 xff0c 支持 TCP UDP HTTP HTTPS 等多种协议 可以将内网服务以安全 便捷的方式通过具有公网 IP 节点的中转暴露到公网 frp 项目官网 https
  • mysql导出excel表格表结构

    里面的字段 xff0c 根据information schema COLUMNS表 SELECT COLUMN NAME 列名 COLUMN TYPE 数据类型 DATA TYPE 字段类型 IFNULL NUMERIC PRECISION
  • 使用Docker-compose安装NextCloud,并部署Collabora作为office服务

    使用Docker compose安装NextCloud xff0c 并部署Collabora作为office服务 安装Docker和docker compose 使用docker compose可以更快速的构建nextcloud需要的各个服
  • docker 部署 joplin server进行文档同步

    Joplin 是一个开源的笔记工具 xff0c 拥有 Windows macOS Linux iOS Android Terminal 版本的客户端 xff0c 可惜暂时还没有web版本的 多端同步功能是笔记工具最重要的功能 只有实现了多端
  • frappe_docker 开发模式初始化问题

    frappe 网络问题导致初始化失败 frappe 以docker的方式部署开发环境教程如下 xff1a frappe docker development at main frappe frappe docker GitHub 1 clo

随机推荐