kit7828 发表于 2022-5-11 11:09

【AT-START-F425测评】 六、串口打印及串口调试组件评测

本帖最后由 kit7828 于 2022-5-11 11:12 编辑

<p>雅特力AT-Start-F425的Demo例程中,有好几个串口usart的例程</p>

<p>对开发者来说,还是非常不错的。对嵌入式开发来说,串口的功能是必不可少的,尤其是很多的调试信息的输出。</p>

<p>demo中提供了printf的例程,可以用于一般的信息打印。事实上,F425的board文件中都内置了printf串口输出的功能。</p>

<p>为了方便开发,移植了正点原子的串口调试组件usmart。</p>

<p>可以通过串口,输入命令进行调试</p>

<p>只要把需要调试的命令加入到结构数组中就可以完成串口调试,非常方便</p>

<pre>
<code>                                                       
extern void LED1_OnOff(uint8_t OnOff);
extern void LED2_OnOff(uint8_t OnOff);
extern void LED3_OnOff(uint8_t OnOff);
//extern void LED4(uint8_t OnOff);

//函数名列表初始化(用户自己添加)
//用户直接在这里输入要执行的函数名及其查找串
struct _m_usmart_nametab usmart_nametab[]=
{
#if USMART_USE_WRFUNS==1         //如果使能了读写操作
        (void*)read_addr,"u32 read_addr(u32 addr)",
        (void*)write_addr,"void write_addr(u32 addr,u32 val)",       
#endif                  
        (void*)LED1_OnOff,"void LED1_OnOff(uint8_t OnOff)",
        (void*)LED2_OnOff,"void LED2_OnOff(uint8_t OnOff)",
        (void*)LED3_OnOff,"void LED3_OnOff(uint8_t OnOff)",
//        (void*)LED4,"void LED4(uint8_t OnOff)",
};                                                  </code></pre>

<p>为了实现这个功能,需要对串口中断,即接收函数进行改写</p>

<pre>
<code>void USART1_IRQHandler(void)
{
        u8 Res;
if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
{
    /* read one byte from the receive data register */
          Res = usart_data_receive(USART1);

               
                if((usart1_rx_counter&amp;0x8000)==0)//接收未完成
                {
                        if(usart1_rx_counter&amp;0x4000)//接收到0x0d
                        {
                                if(Res!=0x0a) usart1_rx_counter=0;//接收错误,重新开始
                                else usart1_rx_counter|=0x8000;        //接收完成了
                        }
                        else //还没收到0x0d
                        {       
                                        if(Res==0x0d) usart1_rx_counter|=0x4000;
                                        else
                                        {
                                                usart1_rx_buffer=Res ;
                                                usart1_rx_counter++;
                                                if(usart1_rx_counter&gt;(USART1_RECV_LEN-1)) usart1_rx_counter=0;//接收数据错误,重新开始接收
                                        }               
                        }
                }                  

}</code></pre>

<p>代码是用的RX_TX这个例程修改的,并且修改了管脚的引用,GPIO复用选择PA9、PA10对应串口1的TX和RX</p>

<p>串口设置的代码如下</p>

<pre>
<code>void usart_configuration(void)
{
gpio_init_type gpio_init_struct;

/* enable the usart2 and gpio clock */
//crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

/* enable the usart1 and gpio clock */
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
//crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);   

gpio_default_para_init(&amp;gpio_init_struct);

/* configure the usart2 tx/rx pin */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type= GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
//gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
//gpio_init(GPIOA, &amp;gpio_init_struct);

/* config usart2 iomux */
//gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_1);
//gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_1);

/* configure the usart1 tx/rx pin */
gpio_init_struct.gpio_pins = GPIO_PINS_9 | GPIO_PINS_10;
gpio_init(GPIOA, &amp;gpio_init_struct);

/* config usart1 iomux */
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1);

/* config usart2 and usart1 nvic interrupt */
//nvic_irq_enable(USART2_IRQn, 0, 0);
nvic_irq_enable(USART1_IRQn, 0, 0);

/* configure usart2 param */
//usart_init(USART2, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
//usart_transmitter_enable(USART2, TRUE);
//usart_receiver_enable(USART2, TRUE);

/* configure usart1 param */
usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(USART1, TRUE);
usart_receiver_enable(USART1, TRUE);

/* enable usart2 and usart1 interrupt */
//usart_interrupt_enable(USART2, USART_RDBF_INT, TRUE);
//usart_enable(USART2, TRUE);

usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);                //USART_RDBF_INT:rdbf interrupt
usart_enable(USART1, TRUE);

//usart_interrupt_enable(USART2, USART_TDBE_INT, TRUE);
//usart_interrupt_enable(USART1, USART_TDBE_INT, TRUE);   //USART_TDBE_INT:tdbe interrupt
} </code></pre>

<p>&nbsp;关闭了发送中断和注释了串口2相关的设置</p>

<p>由于串口调试组件需要定期进行扫描,所以需要定期调用组件检测函数</p>

<pre>
<code>int main(void)
{
system_clock_config();
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
at32_board_init();
usart_configuration();
//tmr3_configuration(1000,95);

printf("\r\n Test For USART-Debug");
while(1)
{
      at32_led_toggle(LED2);
//      at32_led_toggle(LED3);
//      at32_led_toggle(LED4);      
      delay_ms(100);
                usmart_scan();
}
}</code></pre>

<p>这里偷懒了,就用了延时函数,后期可以通过定时器自动调用的方式进行扫描</p>

<p>下面是评测结果</p>

<p>&nbsp;串口命令,通过list可以答应</p>

<p>控制命令直接在串口发送窗口输入就可以,记得加上回车和换行</p>

<p></p>

<p>下面是接线示意图和效果</p>

<p></p>

<p>有需要的小伙伴,可以下载工程文件&nbsp; &nbsp;<a href="https://bbs.eeworld.com.cn/forum.php?mod=attachment&amp;aid=NjA1NDA0fDNmYzI3ODUzMTk3YWI3ZTY4Njk2MGM5YmUzMDJmNGY4fDE2NTIyMzg1OTg%3D&amp;request=yes&amp;_f=.rar" target="_blank">usmart.rar</a></p>

lugl4313820 发表于 2022-5-11 18:59

谢谢分享呀,这个有命令解释功能。串口是单片机的眼睛,手脚。必须掌握。。。

freebsder 发表于 2022-5-11 20:01

<p>谢谢分享,串口基础</p>
页: [1]
查看完整版本: 【AT-START-F425测评】 六、串口打印及串口调试组件评测