本帖最后由 zsy-s 于 2024-12-8 21:08 编辑
背景
用于产生一些常见的波形,通过按钮切换信号的波形。
设计框架
内部实现了三种波形。通过按钮1 实现波形的切换,同时三种波形刚好对应三个led ,会亮起相应的led,提醒当时的波形。
代码
写代码得到一个周期的值
int inx = 0;
while(inx <= 4096){
APP_PRINT("%d ",(int)(4096*sin(PI*inx/2048)));
inx++;
if(!(inx%500)){
APP_PRINT("\r\n inx [%d] \r\n ",inx);
R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
}
}
展示图形如下
开启中断,由于尽可以使用一个led,开启一个中断服务函数就够用了。
相关的配置前文写过,开启代码如下
leds = g_bsp_leds;
开启中断
err = R_ICU_ExternalIrqOpen(&g_external_irq1_ctrl, &g_external_irq1_cfg);
err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);
使能中断
err = R_ICU_ExternalIrqEnable(&g_external_irq1_ctrl);
err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);
三种波形,三角波,sin波,方波,实现函数如下
uint16_t ledstats = 0;
uint16_t vval = 0;
int vdrec = 0;
static void sinbo()
{
if(4096 <= vval){
vval = 0;
}else{
vval++;
}
APP_PRINT("DAC_SetVoltage [%d] [%d]\r\n",vval,sinval[vval]);
// DAC_SetVoltage((float)vval);
R_DAC_Write(&g_dac_ctrl, sinval[vval]);
}
static void sanjiaobo()
{
if(4096 < vval){
vdrec = 0;
}
if(!vval){
vdrec = 1;
}
if(vdrec){
vval++;
}
if(!vdrec){
vval--;
}
APP_PRINT("DAC_SetVoltage [%d] [%d]\r\n",vval,sinval[vval]);
// DAC_SetVoltage((float)vval);
R_DAC_Write(&g_dac_ctrl, vval);
}
static void fangbo()
{
if(4096 < vval){
vval = 0;
}else{
vval++;
}
if(vval <2048){
R_DAC_Write(&g_dac_ctrl, 0);
}else{
R_DAC_Write(&g_dac_ctrl, 4095);
}
}
时间中断函数里,实现切换波形
void gpt_test_isr(timer_callback_args_t *p_args)
{
(void)p_args;
//APP_PRINT("\r\n ** Agpt_test_isr ** \r\n");
if(ledstats & 0x1){
sanjiaobo();
}else if(ledstats & 0x2){
fangbo();
}else{
sinbo();
}
}
按钮中断函数实现led的点亮
void irq_btn_callback0(external_irq_callback_args_t *p_args)
{
(void)p_args;
APP_PRINT("** this is btn0 ** \r\n");
if(!(ledstats & 7)){
ledstats = 1;
}else{
ledstats <<= 1;
}
APP_PRINT("** this is btn0 [%x]** \r\n",ledstats);
R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[1], !!(ledstats & 2));
R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[0], !!(ledstats & 1));
R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[2], !!(ledstats & 4));
}
效果
normal video
代码
结论
从开始时候第一次用e2工具的新奇,到现在初步能够笨手笨脚的配置stack和参数,是一个巨大的进步。少了畏惧心理,配置一下参数,就能直接应用开发,基本不用看手册,看看接口说明,就能上手开发。越来越像纯应用开发了。
感谢eeworld和得捷联手举办的活动,使许许多多的开发者,能够低成本且动力十足的学习到一些东西,飞快的成长,拿玩游戏的时间用来学习,成就很足。希望活动越来越多,得多多参加。
|