fastjs 发表于 2024-11-20 15:36

【Follow me第二季第3期】EK-RA6M5所有任务汇总

本帖最后由 fastjs 于 2024-11-20 20:10 编辑

<p>很荣幸参与【Follow me第二季第3期】,这期活动的开发板为EK-RA6M5,是一款由瑞萨官方开发的评估套件。</p>

<p><span style="font-size:22px;"><strong>一、演示视频</strong></span></p>

<p style="text-align: center;"><iframe allowfullscreen="true" frameborder="0" height="450" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&amp;lessonid=41676" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
<a href="https://training.eeworld.com.cn/video/41676">Follow me第二季第3期演示视频-Follow me第二季第3期演示视频-EEWORLD大学堂</a></p>

<p><span style="font-size:22px;"><strong>二、任务介绍</strong></span></p>

<p><strong><span style="font-size:18px;">任务简介</span></strong></p>

<p>入门任务:搭建环境,下载调试示例程序,Blink,按键;</p>

<p>基础任务:quad-spi flash和octo-spi flash配置及读写速度测试;DAC配置生成波形及性能测试;</p>

<p>进阶任务:示例程序中新增命令打印信息;</p>

<p>扩展任务:设计一个类似信号发生器功能的例程。通过命令或按键,设置DAC输出波形,可通过flash存储历史波形等信息。</p>

<p><span style="font-size:18px;"><strong>物料清单</strong></span></p>

<p>物料为EK-RA6M5开发板和MicroUSB线缆。</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<p><strong><span style="font-size:18px;">设计思路</span></strong></p>

<p>通过USB虚拟串口传输指令,从而实现各个功能,比如调整DAC输出电压的值,以生成波形;存储波形数据,读取波形数据。通过接收命令,可以调整DAC的输出参数,例如增大或减小波形参数的值(范围为0-4095),从而动态生成所需的波形。指令 a 和 s 用于实时增减波形参数,便于快速调整输出。存储功能使用 Quad-SPI 闪存,指令 w 将当前波形数据写入闪存以便保存历史记录,指令r 则从闪存中加载存储的波形数据到内存缓冲区,实现快速回放。启动功能通过 g 指令激活波形发生器,开始输出设定的波形数据。</p>

<p>&nbsp;</p>

<p><span style="font-size:22px;"><strong>三、软件流程图</strong></span></p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p><span style="font-size:22px;"><strong>四、实现细节</strong></span></p>

<p>示例程序为ek_ra6m5/_quickstart下的quickstart_ek_ra6m5_ep工程。</p>

<p><span style="font-size:18px;"><strong>任务一 入门任务</strong></span></p>

<p>开发环境搭建e2 studio</p>

<div style="text-align: center;"></div>

<p>打开示例程序编译后,右键工程,选择Debug As -&gt; Renesas GDB Hardware Debugging下载程序</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<div>编译项目时,由于示例代码所使用的FSP版本问题,可能会报错,修改BSP_CLOCKS_PLL_MUL_10_0为BSP_CLOCKS_PLL_MUL(10, 0)即可。</div>

<div>
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<p>下载好示例程序后,会发现LED初始设置为</p>

<ul>
        <li>LED1 (蓝色):以1 Hz频率闪烁,亮度为10%。</li>
        <li>LED2 (绿色):常亮且亮度最大。</li>
        <li>LED3 (红色):关闭。</li>
        <li>LED5 (调试LED):忽略其橙色闪烁或点亮状态。</li>
</ul>

<p>此时按下用户按钮S1,会改变LED1的亮度,每次按下依次切换为10%、50%和90%循环;按下用户按钮S2:改变LED1的闪烁频率,每次按下依次切换为1 Hz、5Hz和10 Hz循环。</p>

<p>点灯代码,其中代码中的<strong>GPT</strong> 是指 <strong>General Purpose Timer</strong>(通用定时器)</p>

<pre>
<code class="language-cpp">// 更改LED亮度
void gpt_blue_callback(timer_callback_args_t * p_args)
{
    /* Void the unused params */
    FSP_PARAMETER_NOT_USED(p_args);

    switch (s_blueled_flashing)
    {
      case ON:
      {
            if ((s_intense++ ) &lt; s_duty)
            {
                TURN_BLUE_ON
            }
            else
            {
                TURN_BLUE_OFF
            }

            if (s_intense &gt;= 100)
            {
                s_intense = 0;
                s_duty = g_pwm_dcs;
            }
            break;
      }
      default:
      {
            TURN_BLUE_OFF
            s_intense = 0;
            s_duty = g_pwm_dcs;
      }
    }
}

// 更改LED闪烁频率
{
if ((s_ux_bits &amp; (STATUS_UPDATE_FREQ_INFO)) == (STATUS_UPDATE_FREQ_INFO))
      {
            R_GPT_PeriodSet (g_blinker.p_ctrl, g_pwm_rates);

            /* Clear Event */
            xEventGroupClearBits (g_update_console_event, (STATUS_UPDATE_FREQ_INFO));
      }
}</code></pre>

<p>&nbsp;</p>

<p>按键控制灯代码,按键由外部中断实现</p>

<pre>
<code class="language-cpp">/* SW 1 */
void button_irq10_callback(external_irq_callback_args_t *p_args)
{
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    BaseType_t xResult = pdFAIL;
    EventBits_t uxBits;

    /* Void the unused args */
    FSP_PARAMETER_NOT_USED(p_args);

    uxBits = xEventGroupGetBitsFromISR (g_update_console_event);

    if ((uxBits &amp; (STATUS_UPDATE_INTENSE_INFO)) != (STATUS_UPDATE_INTENSE_INFO))
    {
      /* Cast, as compiler will assume calc is int */
      g_board_status.led_intensity = (uint16_t) ((g_board_status.led_intensity + 1) % 3);
      xResult = xEventGroupSetBitsFromISR(g_update_console_event, STATUS_UPDATE_INTENSE_INFO,
                                          &amp;xHigherPriorityTaskWoken);

      /* Was the message posted successfully? */
      if (pdFAIL != xResult)
      {
            /* If xHigherPriorityTaskWoken is now set to pdTRUE then a context
             switch should be requested.The macro used is port specific and will
             be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to
             the documentation page for the port being used. */
            portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
      }
    }
}
/* SW 2 */
void button_irq9_callback(external_irq_callback_args_t *p_args)
{
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    BaseType_t xResult = pdFAIL;
    EventBits_t uxBits;

    /* Void the unused args */
    FSP_PARAMETER_NOT_USED(p_args);

    uxBits = xEventGroupGetBitsFromISR (g_update_console_event);

    if ((uxBits &amp; (STATUS_UPDATE_FREQ_INFO)) != (STATUS_UPDATE_FREQ_INFO))
    {
      /* Cast, as compiler will assume calc is int */
      g_board_status.led_frequency = (uint16_t) ((g_board_status.led_frequency + 1) % 3);
      xResult = xEventGroupSetBitsFromISR(g_update_console_event, STATUS_UPDATE_FREQ_INFO, &amp;xHigherPriorityTaskWoken);

      /* Was the message posted successfully? */
      if (pdFAIL != xResult)
      {
            /* If xHigherPriorityTaskWoken is now set to pdTRUE then a context
             switch should be requested.The macro used is port specific and will
             be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to
             the documentation page for the port being used. */
            portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
      }
    }
}</code></pre>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:18px;"><strong>任务二 基础任务</strong></span></p>

<p>任务2的flash测试功能已经在示例代码中实现了,这里展示配置及测试的核心代码,测试效果如下</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>

<p>quad-spi flash配置代码为示例代码menu.ext.c中的qpi_init(void)函数</p>

<p>octo-spi flash配置代码为示例代码ospi_test.c中configure_dopi_ospi()函数</p>

<p>quad-spi flash和octo-spi flash读写速度测试代码</p>

<pre>
<code class="language-cpp">print_to_console((uint8_t *)
                "\r\nWriting the text block to external Quad-SPI and Octo-SPI flash memories...\r\n");
uint32_t ospi_performance_write_result = 0;
uint32_t ospi_performance_read_result = 0;
uint32_t timer_frequency;
R_GPT_InfoGet(g_memory_performance.p_ctrl, &amp;timer_info);
timer_frequency = timer_info.clock_frequency;
ospi_performance_test (block_size_actual, &amp;ospi_performance_write_result, &amp;ospi_performance_read_result);
ospi_write_result = ((100000000 / timer_frequency) * ospi_performance_write_result) / 100;
qspi_write_result= ((100000000 / timer_frequency) * qspi_write_test(block_size_actual)) / 100;
print_to_console((uint8_t *)"Writing to flash completed\r\n");
      
print_to_console((uint8_t *)"\r\nReading the text block from external Quad-SPI and Octo-SPI flash memories...\r\n");
ospi_read_result= ((100000000 / timer_frequency) * ospi_performance_read_result) / 100;
qspi_read_result= ((100000000 / timer_frequency) * qspi_read_test(block_size_actual)) / 100;
print_to_console((uint8_t *)"Reading from flash completed\r\n");
R_GPT_Close(g_memory_performance.p_ctrl);</code></pre>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>对于DAC波形生成,使用DAC的示例文件</p>

<p>DAC输出端口P014,对应Arduino_A4</p>

<p>ADC输入端口P000,对应MIKROBUS_AN_ARDUINO_A0</p>

<p>用杜邦线连接P014和P000,下载代码后运行效果如下</p>

<div style="text-align: center;"></div>

<div>观察到ADC通道一读取的值随着设定的DAC的增加而增加。</div>

<p>DAC配置生成波形及性能测试代码</p>

<pre>
<code>static fsp_err_t dac_adc_operations(int32_t * input)
{
    fsp_err_t err = FSP_SUCCESS;   // Error status
    /* Write value to DAC module */
    err = R_DAC_Write (&amp;g_dac_ctrl, (uint16_t) (* input));
    /* handle error */
    if (FSP_SUCCESS != err)
    {
      /* dac Write Failure message */
      APP_ERR_PRINT("** DAC Write API failed ** \r\n");
      return err;
    }
    /* Start DAC conversion */
    err = R_DAC_Start (&amp;g_dac_ctrl);
    /* handle error */
    if (FSP_SUCCESS != err)
    {
      /* dac start failure message */
      APP_ERR_PRINT("** DAC Start API failed ** \r\n");
      return err;
    }
    /* Start the ADC scan in Single scan mode*/
    err = R_ADC_ScanStart (&amp;g_adc_ctrl);
    /* handle error */
    if (FSP_SUCCESS != err)
    {
      /* ADC Scan Failure message */
      APP_ERR_PRINT("** ADC ScanStart API failed ** \r\n");
      return err;
    }
    /* Stop and start DAC conversion for consecutive user input values*/
    err = R_DAC_Stop(&amp;g_dac_ctrl);
    /* Handle Error */
    if (FSP_SUCCESS != err)
    {
      /* DAC stop failure message */
      APP_ERR_PRINT("** DAC Stop API failed ** \r\n");
    }
    return err;
}
</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:18px;"><strong>任务三 进阶任务</strong></span></p>

<p>新增命令打印信息</p>

<p>初始打印信息为</p>

<p style="text-align: center;"> &nbsp;</p>

<p>添加打印信息后,删除了暂时用不到的打印命令,显示效果如下,</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<p>按4,进入新增的第四个选项,输入字符串,按下Tab键后,将打印该字符串。</p>

<div style="text-align: center;"></div>

<p>此部分核心代码如下。</p>

<pre>
<code>        block_sz_ndx = 0;
    memset(&amp;s_block_sz_str, 0, INPUT_BUFFER);
    while (false == valid_block_size)
    {
      print_to_console("input: ");
      while ((CONNECTION_ABORT_CRTL != c))
      {
            c = input_from_console ();

            if (block_sz_ndx &lt; block_sz_limit)
            {
                s_block_sz_str = (char_t)c;
                block_sz_ndx++;
            }
            else
            {
                s_block_sz_str = MENU_ENTER_RESPONSE_CRTL;
                c = MENU_ENTER_RESPONSE_CRTL;

            }
            if (MENU_ENTER_RESPONSE_CRTL == c)
            {
                print_to_console("\r\noutput: ");
                s_block_sz_str = '\r';
                s_block_sz_str = '\n';
                print_to_console((void*)s_block_sz_str);
                block_sz_ndx = 0;
                memset(&amp;s_block_sz_str, 0, INPUT_BUFFER);
                break;
            }

            if (MENU_EXIT_CRTL == c)
            {
                valid_block_size = true;
                block_size_actual = 0;
                break;
            }

            if (CARRAGE_RETURN != c)
            {
                sprintf(s_print_buffer, "%c", (char_t)c);
                print_to_console((void*)s_print_buffer);
            }

      }
      if ((MENU_EXIT_CRTL == c) || (CONNECTION_ABORT_CRTL == c))
      {
            break;
      }
    }</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:18px;"><strong>任务四 扩展任务</strong></span></p>

<p>QSPI FLASH型号为MX25L25645G,OSPI FLASH型号为MX25LM51245GM,本次任务将波形信息存储到QSPI FLASH中。QSPI 使用6 个信号连接Flash,分别是四个数据线QIO0~QIO3,一个时钟输出SCLK,一个片选输出(低电平有效)CS#。</p>

<p>设置默认dac输出值为{ 2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072, 4093, 4031, 3887, 3668, 3382, 3042, 2661, 2255, 1841, 1435, 1054, 714, 428, 209, 65, 3, 24, 127, 310, 564, 878, 1240, 1636, 2048 };</p>

<p>这将输出一个正弦波,当输入指令时,其中的值发生增大或减小固定的值,但每个值范围在0-4095间,指令设计为</p>

<ul>
        <li><strong>&#39;a&#39;</strong> - 增加波形参数</li>
        <li><strong>&#39;s&#39;</strong> - 减少波形参数</li>
        <li><strong>&#39;r&#39;</strong> - 从 Quad-SPI 闪存读取波形数据到内存缓冲区</li>
        <li><strong>&#39;w&#39;</strong> - 将当前波形数据写入 Quad-SPI 闪存存储</li>
        <li><strong>&#39;g&#39;</strong> - 启动波形发生器</li>
</ul>

<p>键入指令后,输入Tab键即可执行对应功能。</p>

<p>波形发生器界面</p>

<div style="text-align: center;"></div>

<p>设置DAC输出波形</p>

<pre>
<code>void DAC_Init()
{
    R_DAC_Open(&amp;g_dac0_ctrl, &amp;g_dac0_cfg);
    R_DAC_Start(&amp;g_dac0_ctrl);
}

void DAC_SinWave_Cycle(uint32_t time_interval)
{
    for(uint32_t i = 0 ; i &lt; (sizeof(custom_var)/sizeof(custom_var)); i++)
    {
      R_DAC_Write(&amp;g_dac0_ctrl, custom_var);
      R_BSP_SoftwareDelay(time_interval, BSP_DELAY_UNITS_MILLISECONDS);
    }
}</code></pre>

<p>在flash存储历史波形</p>

<pre>
<code>
/**
* @brief 将波形数据存储到 Quad Flash
* @param buffer 需要存储的波形
* @retval 无
*/
void Write_Waveform_To_Flash(uint16_t *buffer)
{
    fsp_err_t err = FSP_SUCCESS;
    uint32_t page_write_count = 0;
    uint8_t *p_mem_addr = (uint8_t *)QSPI_DEVICE_START_ADDRESS;
    spi_flash_protocol_t current_spi_mode;

    /* Cast to req type */
    p_mem_addr = (uint8_t *)QSPI_DEVICE_START_ADDRESS;
    /* 打开 QSPI 模块 */
//    err = R_QSPI_Open(&amp;g_qspi_ctrl, &amp;g_qspi_cfg);
//    if (FSP_SUCCESS != err)
//    {
//      sprintf(s_print_buffer, "Failed to open QSPI module\r\n");
//      return;
//    }
    /* initialise the QSPI, and change mode to that set in FSP */
    err = qpi_init();
    if (FSP_SUCCESS == err)
    {
      /* The comms mode has changed. So if recovering, this new mode required */
      current_spi_mode = g_qspi_cfg.spi_protocol;
    }
    /* 擦除 QSPI 的指定扇区 */
    err = R_QSPI_Erase(&amp;g_qspi_ctrl, p_mem_addr, SECTOR_SIZE);
    if (FSP_SUCCESS != err)
    {
      sprintf(s_print_buffer, "Failed to erase QSPI flash\r\n");
      return;
    }
    /* 等待擦除完成 */
    err = get_flash_status();
    if (FSP_SUCCESS != err)
    {
      sprintf(s_print_buffer, "Failed to get flash status after erase\r\n");
      return;
    }

    /* 逐页写入波形数据 */
    while (((page_write_count * PAGE_WRITE_SIZE) &lt; sizeof(custom_var)) &amp;&amp; (FSP_SUCCESS == err))
    {
      err = R_QSPI_Write(&amp;g_qspi_ctrl, &amp;buffer, p_mem_addr, PAGE_WRITE_SIZE);
      if (FSP_SUCCESS != err)
      {
            sprintf(s_print_buffer, "Failed to write data to QSPI flash\r\n");
      }
      else
      {
            err = get_flash_status();
            if (FSP_SUCCESS != err)
            {
                sprintf(s_print_buffer, "Failed to get flash status after write\r\n");
            }
      }
      p_mem_addr += PAGE_WRITE_SIZE;
      page_write_count++;
    }
    /* 关闭 QSPI 模块 */
//    err = R_QSPI_Close(&amp;g_qspi_ctrl);
//    if (FSP_SUCCESS != err)
//    {
//      sprintf(s_print_buffer, "Failed to close QSPI module\r\n");
//    }

    /* close QSPI module */
    deinit_qspi(current_spi_mode);
}</code></pre>

<p>读取上一次存储的波形</p>

<pre>
<code>/**
* @brief 从 Quad Flash 读取波形数据
* @param buffer 存储波形的缓冲区
* @retval 无
*/
void Read_Waveform_From_Flash(uint16_t *buffer)
{
    fsp_err_t err = FSP_SUCCESS;
    uint32_t page_read_count = 0;
    uint8_t *p_mem_addr = (uint8_t *)QSPI_DEVICE_START_ADDRESS;
    spi_flash_protocol_t current_spi_mode;

    /* The comms mode of the FLASH device is EXTENDED_SPI by default */
    current_spi_mode = SPI_FLASH_PROTOCOL_EXTENDED_SPI;
    /* 打开 QSPI 模块 */
//    err = R_QSPI_Open(&amp;g_qspi_ctrl, &amp;g_qspi_cfg);
//    if (FSP_SUCCESS != err)
//    {
//      sprintf(s_print_buffer, "Failed to open QSPI module\r\n");
//      return;
//    }
    /* initialise the QSPI, and change mode to that set in FSP */
    err = qpi_init();
    if (FSP_SUCCESS == err)
    {
      /* The comms mode has changed. So if recovering, this new mode required */
      current_spi_mode = g_qspi_cfg.spi_protocol;
    }

    /* 逐页读取波形数据 */
    while ((page_read_count * PAGE_WRITE_SIZE) &lt; sizeof(custom_var))
    {
      memcpy(&amp;buffer, p_mem_addr, PAGE_WRITE_SIZE);
      p_mem_addr += PAGE_WRITE_SIZE;
      page_read_count++;
    }
//    /* 关闭 QSPI 模块 */
//    err = R_QSPI_Close(&amp;g_qspi_ctrl);
//    if (FSP_SUCCESS != err)
//    {
//      sprintf(s_print_buffer, "Failed to close QSPI module\r\n");
//    }
    /* close QSPI module */
    deinit_qspi(current_spi_mode);
}
</code></pre>

<p>调整DAC参数</p>

<pre>
<code>void Adjust_Waveform(int32_t step)
{
    for (uint32_t i = 0; i &lt; sizeof(custom_var) / sizeof(custom_var); i++)
    {
      // 调整值,限制范围在 MIN_VALUE 和 MAX_VALUE 之间
      if (custom_var + step &gt; MAX_VALUE)
      {
            custom_var = MAX_VALUE;
      }
      else if (custom_var + step &lt; MIN_VALUE)
      {
            custom_var = MIN_VALUE;
      }
      else
      {
            custom_var += step;
      }
    }
}</code></pre>

<p>指令输入解析</p>

<pre>
<code>block_sz_ndx = 0;
    memset(&amp;s_block_sz_str, 0, INPUT_BUFFER);
    while (false == response_flag)
    {
      print_to_console("input: ");

      while ((CONNECTION_ABORT_CRTL != c))
      {
            c = input_from_console();
            if (block_sz_ndx &lt; block_sz_limit)
            {
                s_block_sz_str = (char_t)c;
                block_sz_ndx++;
            }
            else
            {
                s_block_sz_str = MENU_ENTER_RESPONSE_CRTL;
                c = MENU_ENTER_RESPONSE_CRTL;

            }
            if (MENU_ENTER_RESPONSE_CRTL == c)
            {
                if (s_block_sz_str == 'a')
                {
                  sprintf(s_print_buffer, "\r\nIncrease waveform parameters\r\n");
                  print_to_console((void*)s_print_buffer);
                  Adjust_Waveform(STEP_SIZE); // 增加波形值
                  sprintf(s_print_buffer, "custom_var contains:\r\n");
                  print_to_console((void *)s_print_buffer);
                  for (uint32_t i = 0; i &lt; 32; i++)
                  {
                        sprintf(s_print_buffer, "custom_var[%u] = %u\r\n", i, custom_var);
                        print_to_console((void *)s_print_buffer);
                  }
                }
                if (s_block_sz_str == 's')
                {
                  sprintf(s_print_buffer, "\r\nDecrease waveform parameters\r\n");
                  print_to_console((void*)s_print_buffer);
                  Adjust_Waveform(-STEP_SIZE); // 减少波形值
                  sprintf(s_print_buffer, "custom_var contains:\r\n");
                  print_to_console((void *)s_print_buffer);
                  for (uint32_t i = 0; i &lt; 32; i++)
                  {
                        sprintf(s_print_buffer, "custom_var[%u] = %u\r\n", i, custom_var);
                        print_to_console((void *)s_print_buffer);
                  }
                }
                if (s_block_sz_str == 'r') // 读取波形数据
                {
                  sprintf(s_print_buffer, "\r\nRead the waveform data from Quad-SPI flash into memory buffer\r\n");
                  print_to_console((void*)s_print_buffer);
                  Read_Waveform_From_Flash(custom_var);
                  is_custom_wave = true;
                  sprintf(s_print_buffer, "After Reading, custom_var contains:\r\n");
                  print_to_console((void *)s_print_buffer);
                  for (uint32_t i = 0; i &lt; 32; i++)
                  {
                        sprintf(s_print_buffer, "custom_var[%u] = %u\r\n", i, custom_var);
                        print_to_console((void *)s_print_buffer);
                  }

                }
                else if (s_block_sz_str == 'w') // 写入波形数据
                {
                  sprintf(s_print_buffer, "\r\nWrite the current waveform data to Quad-SPI flash storage\r\n");
                  print_to_console((void*)s_print_buffer);
                  sprintf(s_print_buffer, "Before Writing, var contains:\r\n");
                  print_to_console((void *)s_print_buffer);
                  for (uint32_t i = 0; i &lt; 32; i++)
                  {
                        sprintf(s_print_buffer, "var[%u] = %u\r\n", i, custom_var);
                        print_to_console((void *)s_print_buffer);
                  }
                  Write_Waveform_To_Flash(custom_var);
                }
                else if (s_block_sz_str == 'g') // 写入波形数据
                {
                  sprintf(s_print_buffer, "\r\nStart Generator...\r\n");
                  print_to_console((void *)s_print_buffer);
                  while(1)
                  {
                        DAC_SinWave_Cycle(10);
                  }
                }

                block_sz_ndx = 0;
                memset(&amp;s_block_sz_str, 0, INPUT_BUFFER);
                break;
            }
            if (MENU_EXIT_CRTL == c)
            {
                response_flag = true;
                block_size_actual = 0;
                break;
            }

            if (CARRAGE_RETURN != c)
            {
                sprintf(s_print_buffer, "%c", (char_t)c);
                print_to_console((void*)s_print_buffer);
            }
            // 输出波形
            DAC_SinWave_Cycle(1);
      }
      if ((MENU_EXIT_CRTL == c) || (0x00 == c))
      {
            break;
      }
    }</code></pre>

<p>向flash写入一个周期的波形数据</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>从flash读取一个周期的波形数据,可以看到读取的波形数据和写入的是一致的。</p>

<div style="text-align: center;"></div>

<p>默认输出波形:</p>

<div style="text-align: center;"></div>

<div>修改DAC输出后波形:</div>

<div style="text-align: center;"></div>

<p><span style="font-size:22px;"><strong>五、心得体会</strong></span></p>

<p>本次活动非常棒,通过本次活动,我对在瑞萨平台上的开发有了更加深入的了解。整个任务过程设计合理,循序渐进,从环境搭建到功能扩展,不仅让我熟悉了开发流程,还提升了实际动手能力。在扩展任务中,熟悉了spi接口操作flash和dac波形生成。此外,EEworld工作人员的全程答疑提供了很大的帮助,解决了活动中的疑问。再次感谢活动组织方和工作人员的精心安排!</p>

<p>&nbsp;</p>

<p><span style="font-size:22px;"><strong>六、代码下载</strong></span></p>

<p><a href="https://download.eeworld.com.cn/detail/fastjs/635004">Follow me第二季第3期任务代码-嵌入式开发相关资料下载-EEWORLD下载中心</a></p>

秦天qintian0303 发表于 2024-11-20 16:41

<p>恭喜完成任务,这还用了一个12指,挺不错的&nbsp;&nbsp;</p>
页: [1]
查看完整版本: 【Follow me第二季第3期】EK-RA6M5所有任务汇总