电子时钟制作(瑞萨RA)(5)----定时器驱动数码管_瑞萨电子时钟-程序员宅基地

技术标签: ##瑞萨  e2studio  R7FA2E1A72DFL  定时器  瑞萨RA  瑞萨ra  ra2e1  单片机  电子时钟  

概述

要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动,数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以设置为2ms刷新一次,这样人眼就看不出闪烁了。

硬件准备

首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开发板:

在这里插入图片描述
在这里插入图片描述

视频教程

https://www.bilibili.com/video/BV1su411L7bQ/

电子时钟制作(瑞萨RA)----(5)定时器驱动数码管

选择定时器

RA MCU 有两个定时器外设:通用 PWM 定时器 (GPT) 和异步通用定时器 (AGT)。在它们之间进行选择时,请考虑以下因素

在这里插入图片描述
时钟源在这设置的是PCKLD 48M 。
可以通过修改该频率来修改占空比频率。

在这里插入图片描述

定时器做计数器配置

点击Stacks->New Stack->Timers->Timer, General PWM (r_gpt)。
在这里插入图片描述

设置定时器制作计数器配置,例如2ms产生一个中断,由于不需要对上升沿和下降沿进行捕获,故只需配置为计数模式即可。
设置2ms刷新一次数码管。
频率=时钟源/period,若设置计数时间为2ms一次,频率为500Hz,则period=48M/500=96000
在这里插入图片描述
配置完毕之后需要在主程序中开启定时器以及开始计数。

/**********************定时器开启***************************************/
       /* Initializes the module. */
       err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
       /* Handle any errors. This function should be defined by the user. */
       assert(FSP_SUCCESS == err);
       /* Start the timer. */
       (void) R_GPT_Start(&g_timer0_ctrl);

在这里插入图片描述

定时器回调函数

可以触发进入回调函数的事件如下所示,我们主要选择溢出事件TIMER_EVENT_CYCLE_END。
在这里插入图片描述
首先定义变量显示数值。

//数码管变量
uint8_t num1=0,num2=0,num3=0,num4=0;//4个数码管显示的数值
uint8_t num_flag=0;//4个数码管和冒号轮流显示,一轮刷新五次

在这里插入图片描述
新建timer_smg.c和timer_smg.h文件。
在回调函数中添加如下代码,每隔2ms刷新一次数码管,4个数字与一个冒号,一共要刷新5次。

timer_smg.c

/*
 * timer_smg.c
 *
 *  Created on: 2023年6月29日
 *      Author: a8456
 */
#include "timer_smg.h"
//数码管变量
extern uint8_t num1,num2,num3,num4;//4个数码管显示的数值
extern uint8_t num_flag;//4个数码管和冒号轮流显示,一轮刷新五次

void timer0_callback(timer_callback_args_t *p_args)
{
    
    /* TODO: add your own code here */
    if (TIMER_EVENT_CYCLE_END == p_args->event)
    {
    
        if(num_flag==0)
            smg_1(num1);
        else if(num_flag==1)
            smg_2(num2);
        else if(num_flag==2)
            smg_3(num3);
        else if(num_flag==3)
            smg_4(num4);
        else if(num_flag==4)
            smg_maohao_open(1);   //冒号

        num_flag++;
        if(num_flag==5)
            num_flag=0;
    }
}

timer_smg.h

/*
 * timer_smg.h
 *
 *  Created on: 2023年6月29日
 *      Author: a8456
 */

#ifndef TIMER_SMG_H_
#define TIMER_SMG_H_

#include "hal_data.h"

#endif /* TIMER_SMG_H_ */

演示效果

在这里插入图片描述

主程序

#include “hal_data.h”
#include <stdio.h>
#include “smg.h”
#include “timer_smg.h”

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

//数码管变量
uint8_t num1=0,num2=0,num3=0,num4=0;//4个数码管显示的数值
uint8_t num_flag=0;//4个数码管和冒号轮流显示,一轮刷新五次

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}

#ifdef GNUC //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
return ch;
}

int _write(int fd,char *pBuffer,int size)
{
for(int i=0;i<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}

/*******************************************************************************************************************//**

  • main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function

  • is called by main() when no RTOS is used.
    *********************************************************************************************************************/
    void hal_entry(void)
    {
    /
    TODO: add your own code here */

    /* Open the transfer instance with initial configuration. */
    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
    assert(FSP_SUCCESS == err);

/数码管测试*****************/
ceshi_smg();
/定时器开启*****************/
/* Initializes the module. /
err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
/
Handle any errors. This function should be defined by the user. /
assert(FSP_SUCCESS == err);
/
Start the timer. */
(void) R_GPT_Start(&g_timer0_ctrl);

   while(1)
   {
   printf("hello world!123\n");
   R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
   }

#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_24312945/article/details/131525225

智能推荐

对每个边缘求最小外接矩形,通过最小矩形提取每个边缘_边缘的最小外接矩形-程序员宅基地

文章浏览阅读4.9k次。#include #include using namespace std;using namespace cv;int main(){Mat src; //源图像Mat tmp; //临时图像Mat dst_bw; //去掉背景后的目标二值图像Mat dst_contours;//轮廓图像src=imread("E:\\单板图片\\求孔洞数_边缘的最小外接矩形

【设计模式】中介者-程序员宅基地

文章浏览阅读865次。中介者,说白了跟市面上黑中介类似。当然这个中介,开发者是可以控制其行为的。也是在一定的信任关系上建立的。该模式要解决的问题是,一堆对象之间交叉耦合问题。网上看过群聊的例子。如果没有任何一个平台,多人之间的会话会是什么样的呢?不举多人,就三个吧A想把一句话说给BC,那么他首先要知道B和C在哪儿,然后分别告诉对方,自己想说的事情。如果再加一个人呢?问题很明显,此时各种群聊工具应运而生。我写

Mysql列自增是怎么实现的_mysql 自增序列生成原理-程序员宅基地

文章浏览阅读1.8k次。AUTO_INCREMENT两种情况1、在载入语句执行前,已经不确定要插入多少条记录。在执行插入语句时在表级别加一个auto-inc锁,然后为每条待插入记录的auto-increment修饰的列分配递增的值,语句执行结束后,再把auto-inc锁释放掉。一个事务再持有auto-inc锁的过程中,其他事务的插入语句都要被阻塞,可以保证一个语句中分配的递增值是连续的。AUTO-INC锁的..._mysql 自增序列生成原理

半导体器件基础_掺杂半导体的带隙-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏17次。半导体能带结构示意图:上方两条白色带为没有电子填充的带,下面三条灰色带为充满电子的带,其中最高一条灰色带为价带,它与最低一条白色带之间的空隙为能隙空穴又称电洞(Electron hole),在固体物理学中指共价键上流失一个电子,最后在共价键上留下空位的现象导带(英语:conduction band),又名传导带,是指半导体或是绝缘体材料中,一种电子所具有能量的范围。这个能量的范围高..._掺杂半导体的带隙

基于C++和OpenCV的中心线提取算法_图像中心线提取c++-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏26次。基于C++和OpenCV的中心线提取算法加权平方灰度重心法介绍算法演示加权平方灰度重心法介绍详情见 https://blog.csdn.net/u010518385/article/details/101015604算法演示下面展示 函数-输入图像和阈值,输出点。void get_median_line(Mat& src, int thresh, vector<Point2d>& points){ if (src.empty()) return; // 一、_图像中心线提取c++

HTML/CSS 常用单词整理_css上下外边距单词-程序员宅基地

文章浏览阅读8.3k次,点赞27次,收藏93次。页面布局(layout)header 头部/页眉;index 首页/索引;logo 标志;nav/sub_nav 导航/子导航;banner 横幅广告;main/content 主体/内容;container/con 容器;wrapper/wrap 包裹(类似于container);menu 菜单;sub_menu/second_menu 子菜单/二级菜单;..._css上下外边距单词

随便推点

超全的莫队算法一遍过-程序员宅基地

文章浏览阅读3.6k次,点赞17次,收藏63次。莫队的基本思想、回滚莫队、树上莫队、二次离线,一文搞定。什么?你还不会莫队?看完这篇文章你就会了_莫队

vmware 安装 win10_vmware 退出iso-程序员宅基地

文章浏览阅读3.3k次。1. 下载安装vm软件,地址:VM下载2. 下载win10 iso镜像文件 (1) 下载win10安装工具:win10安装工具下载 (2) 下载完成后,选择给其他电脑安装ios文件即可得到win10的iso镜像文件(考验网速的时刻到了)。 ps:试过各种百度出来的镜像文件,发现没有能用的,还是乖乖通过官方方式下载吧。3. 安装win10 ios镜像文件 参..._vmware 退出iso

PTA-求函数的值_7-2 求函数的值编写程序,求s(x)前10项的和,x从键盘输入。-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏3次。求函数的值:已知 s(x) = x -x^3/(3x1!)+x^5/(5x2!)-x^7/(7x3!)+... 。编写程序,求s(x)前10项的和,x从键盘输入。_7-2 求函数的值编写程序,求s(x)前10项的和,x从键盘输入。

(6.1)各种USB接口简介_常用usb接口-程序员宅基地

文章浏览阅读3.6w次,点赞7次,收藏76次。/* AUTHOR: Pinus* Creat on : 2018-11-3* REFS : Type-C与Type-A、Type-B接口 Linux USB驱动学习总结(一)---- USB基本概念及驱动架构*/USB概念介绍USB,Universal Serial Bus(通用串行总线),是一个外部总线标准,用于规范电脑与外部设备的连接和通..._常用usb接口

通过Kivy将Python文件打包成apk_python程序通过kivy打包为apk且可以调用摄像头-程序员宅基地

文章浏览阅读9.3w次,点赞39次,收藏457次。一.前言Kivy 是一个开源的 Python 框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等。且Kivy 可以运行于 Windows, Linux,MacOS, Android, iOS 等当前绝大部分主流桌面/移动端操作系统。周日在配置Kivy时,教程繁多繁琐,让自己有些找不着北,挨个试后,经常在某处卡壳,屡屡碰壁,希望自己接下来的_python程序通过kivy打包为apk且可以调用摄像头

keil中invalid combination of type specifiers和duplicate specifier in declaration错误-程序员宅基地

文章浏览阅读8.9k次。由于之前的unsigned char型数据被宏定义为uchar,即#define uchar unsigned char,但是在标准的stm32工程中unsigned char是被定义为uint8_t,所以我就把所有之前定义的uchar通过keil的替换功能全部替换为uint8_t,但是之后编译居然出现20个错误!!!!我做了什么???并且所有的错误都指向typedef unsigned ..._invalid combination of type