Hướng dẫn Bài 7.1 USART Interrupt

#1
xin chào mọi người, mình xin bổ xung thêm nội dung các bài viết trong tut của mình. hiện tại mình đã dùng ngắt được trên usart2 (PA2, PA3), còn usart1 (PA9,PA10) đang có vấn đề mình sẽ khắc phục sau.

cách khởi tạo interrupt dành cho usart2, giống như cấu hình usart bình thường:
Mã:
void usart2_setup(unsigned long int BaundRate)
{
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  // cấu hình cho PA2 và PA3
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);// cấp xung cho usart2
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);// dùng chân PA2
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);// dùng chân PA3
  /* Cấu hình USART2 chân:  Rx và Tx ----------------------------*/
  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_3|GPIO_Pin_2; // sử dụng PA2, PA3
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;// chọn speed
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;// chế độ Alternate function Mode
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP; //
  GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;// trở treo kéo lên vcc
  GPIO_Init(GPIOA, &GPIO_InitStructure);
      
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  USART_InitStructure.USART_BaudRate   = BaundRate;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits   = USART_StopBits_1;
  USART_InitStructure.USART_Parity     = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART2, &USART_InitStructure);
  USART_Cmd(USART2,ENABLE);
}
khởi tạo ngắt cho usart bằng NVIC :
Mã:
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // chọn cờ ngắt là usart2
    NVIC_InitStructure.NVIC_IRQChannelPriority = 1; // độ ưu tiên ( 0...3)
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // cho phép sử dụng ngắt
    NVIC_Init(&NVIC_InitStructure);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // cho phép ngắt USART_IT_RXNE hoạt động
}
tất cả các ngắt đều được khai báo trong hàm Stm32f0xx_IT.c

Mã:
void USART2_IRQHandler(void)
{
    unsigned char data;
    // ngat truyen
    if (USART_GetITStatus(USART2, USART_IT_TXE) != RESET) // nếu cờ USART_IT_TXE được kích hoạt
        {
           
        }
  // ngat nhan      
    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // nếu cờ USART_IT_RXNE được kích hoạt
        {
        data = USART_ReceiveData(USART2);// đọc dữ liệu
       // đây là đoạn code mẫu của mình, dùng để tách chuỗi dữ liệu có định dạng : <0x0d><0x0a><data...><0x0d><0x0a>
        if((data!=0x0d)&&(data!=0x0a)) // \n
            {
            Rx_Complete=0;
            Bluetooth_Buff[Counter_Buff]=data;
            Counter_Buff++;
            if(Counter_Buff>=20) Counter_Buff=0;  
            }
        else if((data==0x0d)||(data==0x0a))
            {
            Counter_Buff=0;
            Rx_Complete=1;// cờ báo hiệu nhận chuỗi thành công
            }

        }
      
}
khi sử dụng :

Mã:
if(Rx_Complete==1)
            {
            // các lệnh thực hiện với chuỗi
            //LCD16X2_Gotoxy(0,0);
            //sprintf(string,"RX=%s       ",Bluetooth_Buff);
           // LCD16X2_PutString(string);
            Rx_Complete=0;   // xóa cờ báo nhận chuỗi, chờ nhận chuỗi tiếp theo
            }
code mẫu : LCD16X2 - timer
 
Sửa lần cuối:

Quảng cáo Google