国民技术N32G031开发笔记 - 定时器+GPIO

N32G031定时器+GPIO点灯

GPIO模块

在这里插入图片描述
关于GPIO口的说明,请查看官方的指导手册。文档有中英文的,在这里就不啰嗦了。

GPIO口配置

配置PB1脚为推挽输出。使用PB1来点亮LED灯。直接操作寄存器来实现。
硬件接线图:
在这里插入图片描述

  • gpio.h
#ifndef __GPIO_H__
#define __GPIO_H__

#include "n32g031.h"

//PB1(0) -> PB1=0(低电平,此时LED点亮);PB1(X)只要X不等于0,PB1输出高电平,此时LED熄灭
#define PB1(X) GPIOB->PBSC = (X)>0 ? (1<<1):(0X10000<<1)

void Gpio_init(void);//gpio口初始化


#endif 
  • gpio.c
#include "gpio.h"



void Gpio_init(void)
{
	RCC->APB2PCLKEN |=(1<< 3);//使能GPIOB时钟
	
	GPIOB->PMODE &= (~(3 << 2));//清除PB1的模式
	GPIOB->PMODE |= (1<<2); //PB1设置为通用输出模式
	GPIOB->POTYPE &=(~(1<<1)); //PB1设置为推挽输出
	GPIOB->SR &=(~(1<<1)); //PB1快速翻转
	GPIOB->PUPD &=(~(3<<2));//PB1无上下拉
	GPIOB->DS |=(1<<1);//PB1设为低驱动能力(8mA(5V)/4mA(3.3V)/2mA(1.8V)
	GPIOB->POD |=(1<<1);//PB1输出高电平
}

通用定时器TIM3

在这里插入图片描述
关于TIM3的说明,请查看官方的指导手册。文档有中英文的,在这里就不啰嗦了。重要的解析会在代码里注释。

TIM3配置

TIM3配置为定时器,并且产生中断。使用寄存器编写。

  • timer.h
#ifndef __TIMER_H__
#define __TIMER_H__

#include "n32g031.h"
#include <stdint.h>

void TIM3Init_ds(uint16_t PrescalerVal, uint16_t period);

#endif 
  • timer.c
#include "timer.h"
#include "gpio.h"
/*
*fck_psc=48MHz
* PrescalerVal - 预分频值
* period - 装载周期
*/
void TIM3Init_ds(uint16_t PrescalerVal, uint16_t period)
{
	RCC->APB1PCLKEN |=(1<<1);//使能TIM3的时钟
	
	TIM3->CTRL1 =0;
	TIM3->CTRL1 |=(1<<7);//自动重装载预装载允许位:1-TIMx_AR 寄存器的影子寄存器使能
	TIM3->CTRL1 |=(0<<5);//00:边缘对齐模式。 TIMx_CTRL1.DIR 指定向上计数或向下计数。
	TIM3->CTRL1 |=(0<<4);//0:计数器向上计数;1:计数器向下计数。
	TIM3->CTRL1 |=(0<<3);//0:禁用单脉冲模式,发生更新事件时不影响计数器计数。
	TIM3->CTRL1 |=(1<<2);//更新请求源:1:如果更新中断或 DMA 请求使能,只有计数器上溢/下溢会产生更新中断或 DMA请求。
	TIM3->CTRL1 |=(0<<1);//0-启用更新事件;1:UEV 禁用。 不生成更新事件,影子寄存器(AR、PSC 和 CCDATx)保持它们的值。
	
	TIM3->CTRL2=0;//控制寄存器2
	TIM3->SMCTRL=0;//从模式控制寄存器
	TIM3->DINTEN=0;//DMA/中断使能寄存器
	
	TIM3->STS=0;//状态寄存器 UDITF[0] -1:发生更新中断。TITF[6] -触发器中断标记:0:无触发器事件产生;1:触发中断等待响应。 
	TIM3->EVTGEN=0;
	//TIM3->EVTGEN |=(1<<0);//产生更新事件 (Update generation) 该位由软件置’1’,由硬件自动清’0’。当由软件设置1时,该位可以生成更新事件。
												//而此时计数器会重新初始化,预分频计数器会被清零,计数器在中央对齐或向上计数模式下会被清零,但在向下计数模式下取TIMx_AR寄存器的值。
	TIM3->CNT=0;//计数器的值设置为0
	
	RCC->CFG &=(~(0X07<<8));//配置APB1 时钟PCLK1 的预分频系数。0xx:HCLK 不分频
	//RCC->CFG |=(0X06<<8);//fAPB1=HCLK/8
	
	TIM3->PSC = PrescalerVal;//f=fck_psc/(PrescalerVal+1)
	TIM3->AR = period;//自动重装载的值
	
	TIM3->DINTEN |=(1<<0);//:允许更新中断。
	TIM3->CTRL1 |=1;//使能计数器
	
	
	//TIM3接到中断线16上。NVIC配置,详情请参考Cortex-M0编程手册
	NVIC->IP[4] |= (NVIC->IP[4]&(~(0xff<<0)))|(0Xb0<<0);//16/4=4; 16%4=0;最大只能设置为192=0xc0,此处设置优先级为0xb0=176
	NVIC->ISER[0] |=(1<<16);//TIM3 NVIC中断使能(写0无效)
}

uint8_t ONOrOFF=0XFF;
void TIM3_IRQHandler(void)
{
	if((TIM3->STS & 0X01))//发生更新中断
	{
		TIM3->STS &=(~0x01);//清除更新中断标志

		PB1(ONOrOFF);//LED转态翻转
		ONOrOFF=~ONOrOFF;
	}
	
}
  • main.c
#include "gpio.h"
#include "timer.h"

int main(void)
{
    /* SystemInit() function has been called by startup file startup_n32g031.s */
    /* Configure the system clock to 48 MHz */    

	Gpio_init();
	TIM3Init_ds(48000-1,999);//1s
    while (1)
    {          
       
    }
}

结尾

  • 实验现象:每隔1秒,LED电平翻转一次。
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
国民技术N32G030芯片也支持系统滴答定时器。根据引用\[1\]中的代码,可以看出SysTick定时器的配置和中断处理函数的实现。SysTick定时器是一个24位定时器,用于提供时间基准,多用于操作系统和对时间要求严格的应用场景。SysTick定时器的计数值保存在当前计数值寄存器STK_VAL中,每接收到一个时钟脉冲,计数值就会减1。当计数值减到0时,硬件会自动将重装载寄存器STK_LOAD中保存的数值加载到计数值寄存器STK_VAL,使其重新计数。这样循环往复,只要不清除使能位,系统滴答定时器就会一直工作。根据引用\[2\]中的说明,如果SystemCoreClock为80MHz,那么每1ms进入滴答定时器中。所以,国民技术N32G030芯片的系统滴答定时器的配置和使用方式与GD32F4芯片类似。 #### 引用[.reference_title] - *1* [GD32F4xx系统时钟滴答定时器](https://blog.csdn.net/weixin_43647919/article/details/124614568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [系统滴答定时器](https://blog.csdn.net/m0_54929728/article/details/124385512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木龠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值