打印
[Atmel]

SAMD21串口接收中断问题

[复制链接]
905|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
        问题:用Microchip Studio 中的代码生成器配置串口,接收中断配置,但是生成的代码里找不到中断入口函数,无法通过中断来接收串口的数据,发送OK。因为现有项目使用的都是代码生成器生成的,故没有使用ASF库里面的串口函数,**大家可以指点迷津。
       串口参数配置:
      
生成的相关代码:

int8_t USART_0_init()
{

    if (!hri_sercomusart_is_syncing(SERCOM0, SERCOM_USART_SYNCBUSY_SWRST)) {
           uint32_t mode = SERCOM_USART_CTRLA_MODE(1);
        if (hri_sercomusart_get_CTRLA_reg(SERCOM0, SERCOM_USART_CTRLA_ENABLE)) {
                 hri_sercomusart_clear_CTRLA_ENABLE_bit(SERCOM0);
                hri_sercomusart_wait_for_sync(SERCOM0, SERCOM_USART_SYNCBUSY_ENABLE);
        }
        hri_sercomusart_write_CTRLA_reg(SERCOM0, SERCOM_USART_CTRLA_SWRST | mode);
    }
    hri_sercomusart_wait_for_sync(SERCOM0, SERCOM_USART_SYNCBUSY_SWRST);

    hri_sercomusart_write_CTRLA_reg(SERCOM0,
            1 << SERCOM_USART_CTRLA_DORD_Pos           /* Data Order: enabled */
            | 0 << SERCOM_USART_CTRLA_CMODE_Pos    /* Communication Mode: disabled */
            | 0 << SERCOM_USART_CTRLA_FORM_Pos     /* Frame Format: 0 */
            | 0 << SERCOM_USART_CTRLA_SAMPA_Pos    /* Sample Adjustment: 0 */
            | 2 << SERCOM_USART_CTRLA_SAMPR_Pos    /* Sample Rate: 2 */
            | 0 << SERCOM_USART_CTRLA_IBON_Pos     /* Immediate Buffer Overflow Notification: disabled */
            | 0 << SERCOM_USART_CTRLA_RUNSTDBY_Pos /* Run In Standby: disabled */
            | 1 << SERCOM_USART_CTRLA_MODE_Pos);   /* Operating Mode: enabled */

    hri_sercomusart_write_CTRLA_TXPO_bf(SERCOM0, SERCOM0_TXPO);
    hri_sercomusart_write_CTRLA_RXPO_bf(SERCOM0, SERCOM0_RXPO);

    hri_sercomusart_write_CTRLB_reg(SERCOM0,
            1 << SERCOM_USART_CTRLB_RXEN_Pos         /* Receiver Enable: enabled */
            | 1 << SERCOM_USART_CTRLB_TXEN_Pos   /* Transmitter Enabl: enabled */
            | 0 << SERCOM_USART_CTRLB_PMODE_Pos  /* Parity Mode: disabled */
            | 0 << SERCOM_USART_CTRLB_ENC_Pos    /* Encoding Format: disabled */
            | 0 << SERCOM_USART_CTRLB_SFDE_Pos   /* Start of Frame Detection Enable: disabled */
            | 0 << SERCOM_USART_CTRLB_COLDEN_Pos /* Collision Detection Enable: disabled */
            | 0 << SERCOM_USART_CTRLB_SBMODE_Pos /* Stop Bit Mode: disabled */
            | 0);                                /* Character Size: 0 */

       hri_sercomusart_write_BAUD_reg(SERCOM0, SERCOM0_BAUD_RATE);

    // hri_sercomusart_write_RXPL_reg(SERCOM0,0); /* Receive Pulse Length: 0 */

    // hri_sercomusart_write_DBGCTRL_reg(SERCOM0,0 << SERCOM_USART_DBGCTRL_DBGSTOP_Pos); /* Debug Stop Mode: disabled */

       hri_sercomusart_write_INTEN_reg(SERCOM0,
            0 << SERCOM_USART_INTENSET_ERROR_Pos       /* Error Interrupt Enable: disabled */
            | 0 << SERCOM_USART_INTENSET_RXBRK_Pos /* Receive Break Interrupt Enable: disabled */
            | 0 << SERCOM_USART_INTENSET_CTSIC_Pos /* Clear to Send Input Change Interrupt Enable: disabled */
            | 0 << SERCOM_USART_INTENSET_RXS_Pos   /* Receive Start Interrupt Enable: disabled */
            | 1 << SERCOM_USART_INTENSET_RXC_Pos   /* Receive Complete Interrupt Enable: enabled */
            | 0 << SERCOM_USART_INTENSET_TXC_Pos   /* Transmit Complete Interrupt Enable: disabled */
            | 0 << SERCOM_USART_INTENSET_DRE_Pos); /* Data Register Empty Interrupt Enable: disabled */

    hri_sercomusart_write_CTRLA_ENABLE_bit(SERCOM0, 1 << SERCOM_USART_CTRLA_ENABLE_Pos); /* Enable: enabled */

    return 0;
}


void USART_0_PORT_init()
{

    gpio_set_pin_function(TX, PINMUX_PA04D_SERCOM0_PAD0);

    gpio_set_pin_function(RX, PINMUX_PA05D_SERCOM0_PAD1);
}

void USART_0_enable()
{
    hri_sercomusart_set_CTRLA_ENABLE_bit(SERCOM0);
}

void system_init(void)
{
    init_mcu();

    // GPIO on PB30

    gpio_set_pin_level(LED,
                       // <y> Initial level
                       // <id> pad_initial_level
                       // <false"> Low
                       // <true"> High
                       true);

    // Set pin direction to output
    gpio_set_pin_direction(LED, GPIO_DIRECTION_OUT);

    gpio_set_pin_function(LED, GPIO_PIN_FUNCTION_OFF);

    USART_0_CLOCK_init();
    USART_0_init();
    USART_0_PORT_init();
    USART_0_enable();
    delay_driver_init();

    //WDT_0_init();
}



使用特权

评论回复

相关帖子

沙发
li880wert| | 2023-6-28 10:38 | 只看该作者
这个Microchip 单片机趁早放弃,开发环境复杂一B,那个IDE每个版本都差异巨大,还很吃电脑硬件一般的XP和WIN732位根本装不了他那个IDE。
SAMD21 这个单片机也是复杂的一B,传统的单片机时钟都是简单的,他这个系列整的复杂,那时钟树各种开环,闭环配置,
最主要的是还整了个复用,而且复用的寄存器都是一样的。原本简简单单的功能特复杂。前2年找不到带USB 串口的单片机,用了这个,特地花了2个多星期 自己用寄存器写完了这个项目

使用特权

评论回复
板凳
zwsam| | 2023-11-28 09:02 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝