打印
[活动专区]

【AT-START-L021测评】串口中断通信

[复制链接]
168|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dami|  楼主 | 2025-1-4 19:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
                                 【AT-START-L021测评】串口中断通信


1,AT32 Work Bench v1.1.05 生成mdk代码
2,配置串口通信为发送中断,接收中断和中断允许。

代码如下
void wk_usart1_init(void)
{
  /* add user code begin usart1_init 0 */

  /* add user code end usart1_init 0 */

  gpio_init_type gpio_init_struct;
  gpio_default_para_init(&gpio_init_struct);

  /* add user code begin usart1_init 1 */

  /* add user code end usart1_init 1 */

  /* configure the TX pin */
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  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_9;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);

  /* configure the RX pin */
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  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_10;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);

  /* config usart1 clock source */
  crm_usart_clock_select(CRM_USART1, CRM_USART_CLOCK_SOURCE_PCLK);

  /* configure param */
  usart_init(USART1, 38400, USART_DATA_8BITS, USART_STOP_1_BIT);
  usart_transmitter_enable(USART1, TRUE);
  usart_receiver_enable(USART1, TRUE);
  usart_parity_selection_config(USART1, USART_PARITY_NONE);

  usart_hardware_flow_control_set(USART1, USART_HARDWARE_FLOW_NONE);

  /**
   * Users need to configure USART1 interrupt functions according to the actual application.
   * 1. Call the below function to enable the corresponding USART1 interrupt.
   *     --usart_interrupt_enable(...)
   * 2. Add the user's interrupt handler code into the below function in the at32l021_int.c file.
   *     --void USART1_IRQHandler(void)
   */

  /* add user code begin usart1_init 2 */
   <font color="#ff0000">usart_interrupt_enable(USART1, USART_RDBF_INT,TRUE),</font>
  /* add user code end usart1_init 2 */

  <font color="#8b0000">usart_enable(USART1, TRUE);</font>

  /* add user code begin usart1_init 3 */

  /* add user code end usart1_init 3 */
}


3,编写接收中断发送中断子程序。
extern uint8_t usart1_tx_buffer[];
//extern uint8_t usart2_rx_buffer[];
extern uint8_t usart1_rx_buffer[];
//extern uint8_t usart2_tx_counter;
extern uint8_t usart1_tx_counter;
//extern uint8_t usart2_rx_counter;
extern uint8_t usart1_rx_counter;
//extern uint8_t usart2_tx_buffer_size;
extern uint8_t usart1_tx_buffer_size;


/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  this function handles USART1 handler.
  * @param  none
  * @retval none
  */
void USART1_IRQHandler(void)
{
  /* add user code begin USART1_IRQ 0 */

  /* add user code end USART1_IRQ 0 */
  /* add user code begin USART1_IRQ 1 */
if(usart_interrupt_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  {
    /* read one byte from the receive data register */
    usart1_rx_buffer[usart1_rx_counter++] = usart_data_receive(USART1);

    if(usart1_rx_counter == usart1_tx_buffer_size)
    {
      /* disable the usart1 receive interrupt */
//     usart_interrupt_enable(USART1, USART_RDBF_INT, FALSE);
                        usart1_rx_counter =0;
    }
  }

  if(usart_interrupt_flag_get(USART1, USART_TDBE_FLAG) != RESET)
  {
    /* write one byte to the transmit data register */
  //  usart_data_transmit(USART1, usart1_tx_buffer[usart1_tx_counter++]);

    if(usart1_tx_counter == usart1_tx_buffer_size)
    {
      /* disable the usart1 transmit interrupt */
//     usart_interrupt_enable(USART1, USART_TDBE_INT, FALSE);
                        usart1_tx_counter=0;
    }
  }
  /* add user code end USART1_IRQ 1 */
}


4,编写主程序。
/* private includes ----------------------------------------------------------*/
/* add user code begin private includes */
#define COUNTOF(a)                       (sizeof(a) / sizeof(*(a)))
//#define USART2_TX_BUFFER_SIZE            (COUNTOF(usart2_tx_buffer) - 1)
#define USART1_TX_BUFFER_SIZE            (COUNTOF(usart1_tx_buffer) - 1)
//uint8_t usart2_tx_buffer[] = "usart transfer by interrupt: usart2 -> usart1 using interrupt";
uint8_t usart1_rx_buffer[100];
#define USART1_RX_BUFFER_SIZE            (COUNTOF(usart1_rx_buffer) - 1)
uint8_t usart1_tx_buffer[] = "usart transfer by interrupt: usart1 using interrupt";
//uint8_t usart2_rx_buffer[USART1_TX_BUFFER_SIZE];
//volatile uint8_t usart2_tx_counter = 0x00;
volatile uint8_t usart1_tx_counter = 0x00;
//volatile uint8_t usart2_rx_counter = 0x00;
volatile uint8_t usart1_rx_counter = 0x00;
//uint8_t usart2_tx_buffer_size = USART2_TX_BUFFER_SIZE;
uint8_t usart1_tx_buffer_size = USART1_TX_BUFFER_SIZE;
uint8_t usart1_rx_buffer_size = USART1_RX_BUFFER_SIZE;
int main(void)
{
  /* add user code begin 1 */

  /* add user code end 1 */

  /* system clock config. */
  wk_system_clock_config();

  /* config periph clock. */
  wk_periph_clock_config();

  /* nvic config. */
  wk_nvic_config();

  /* timebase config. */
  wk_timebase_init();

  /* init usart1 function. */
  wk_usart1_init();

  /* init gpio function. */
  wk_gpio_config();

  /* add user code begin 2 */

  /* add user code end 2 */

  while(1)
  {
               
                                /* add user code begin 3 */
                if((usart1_rx_counter>=4)&&(usart1_rx_buffer[0]=='s')&&(usart1_rx_buffer[1]=='e')&&(usart1_rx_buffer[2]=='n')&&(usart1_rx_buffer[3]=='d'))
                {       
                                int i =0;
                          
                               
                                gpio_bits_reset(led4_GPIO_PORT, led4_PIN);
                                gpio_bits_reset(led2_GPIO_PORT, led2_PIN | led3_PIN);
                                wk_delay_ms(100);//DelayMs(1000);
               
                                gpio_bits_set(led4_GPIO_PORT, led4_PIN);
                                gpio_bits_set(led2_GPIO_PORT, led2_PIN | led3_PIN);
                                wk_delay_ms(100);//DelayMs(1000);
                                usart1_tx_counter=0;
                          for(i =0;i<usart1_tx_buffer_size;i++)
                                {       
                                        usart_data_transmit(USART1, usart1_tx_buffer[usart1_tx_counter++]);
                                        wk_delay_ms(1);
                                }
                                usart1_rx_counter=0;
                          usart1_rx_buffer[0]=0;
                                usart1_rx_buffer[1]=0;
                                usart1_rx_buffer[2]=0;
                          usart1_rx_buffer[3]=0;
                        }
    /* add user code end 3 */
  }
}


5,编译调试。
6,测试OK。

使用特权

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

本版积分规则

66

主题

1058

帖子

6

粉丝