Basierend auf RASC Keil Electronic Clock Production 6_ Timer Drive Digital Tube
Überblick
Damit jede Nixie-Röhre unterschiedliche Zahlen anzeigt, müssen die Nixie-Röhren jedoch kontinuierlich nacheinander betrieben werden und die Bildwiederholfrequenz zwischen den Nixie-Röhren sollte schnell genug sein, damit das Flackern zwischen den Nixie-Röhren nicht sichtbar ist. Die Aktualisierungsfrequenz kann auf 2 ms eingestellt werden, um eine einmalige Aktualisierung durchzuführen, sodass das menschliche Auge das Flimmern nicht sehen kann.
Hardware-Vorbereitung
Zuerst müssen Sie ein Entwicklungsboard vorbereiten. Hier bereite ich ein Entwicklungsboard mit dem Chipmodell R7FA2E1A72DFL vor:
Videoanleitung
https://www.bilibili.com/video/BV1rj41197iQ/
Keil elektronische Uhrproduktion basierend auf RASC (Renesas RA) ---- (5) LED-Digitalröhrenantrieb
Timer auswählen
Die RA-MCU verfügt über zwei Timer-Peripheriegeräte: den Universal-PWM-Timer (GPT) und den asynchronen Universal-Timer (AGT). Berücksichtigen Sie bei der Auswahl die folgenden Faktoren
Die hier eingestellte Taktquelle ist PCKLD 48M.
Die Arbeitszyklusfrequenz kann durch Modifizieren dieser Frequenz geändert werden.
Timer als Zählerkonfiguration
Verwenden Sie Stacks->New Stack->Timers->Timer, General PWM (r_gpt)。
Stellen Sie den Timer ein, um die Zählerkonfiguration vorzunehmen. Beispielsweise wird bei 2 ms ein Interrupt generiert. Da die steigenden und fallenden Flanken nicht erfasst werden müssen, muss er nur als Zählmodus konfiguriert werden.
Stellen Sie 2 ms ein, um die digitale Röhre einmal zu aktualisieren.
Frequenz = Taktquelle/Periode. Wenn die Zählzeit einmal auf 2 ms eingestellt ist und die Frequenz 500 Hz beträgt, ist Periode = 48 M/500 = 96000
Nach der Konfiguration müssen Sie den Timer im Hauptprogramm starten und mit dem Zählen beginnen.
/**********************定时器开启***************************************/
/* 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-Rückruffunktion
Die Ereignisse, die die Rückruffunktion auslösen können, sind wie folgt. Wir wählen hauptsächlich das Überlaufereignis TIMER_EVENT_CYCLE_END.
Definieren Sie zunächst die Variable, um den Wert anzuzeigen.
//数码管变量
uint8_t num1=0,num2=0,num3=0,num4=0;//4个数码管显示的数值
uint8_t num_flag=0;//4个数码管和冒号轮流显示,一轮刷新五次
Erstellen Sie neue Dateien timer_smg.c und timer_smg.h.
Fügen Sie der Rückruffunktion den folgenden Code hinzu, um die Nixie-Röhre alle 2 ms, 4 Zahlen und einen Doppelpunkt, insgesamt 5 Aktualisierungen, zu aktualisieren.
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_ */
Demonstrationseffekt
Hauptprogramm
#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
}