Tình hình là em đang gặp vấn đề về việc xử lý các ngắt với PIC32MX150F128B. Cụ thể như thế này:
1. Tại file main.c em thiết lập các ngắt cho timer2,3,4. Ví dụ timer 4.
//////////////// Timer4 config
T4CON = 0x0; // Stop the timer and clear the control register,
// prescaler at 1:1,internal clock source
TMR4 = 0x0; // Clear the timer register
PR4 =setPR(0.05); // Load the period register..50ms
IPC4bits.INT4IP=3;; // Set priority level = 3
IPC4bits.INT4IS=3; // Set subpriority level = 3
IFS0bits.INT4IF=0;// Clear the timer interrupt status flag
IEC0bits.INT4IE=0; // Enable timer interrupts
T4CONSET = 0x8000; // Start the timer
2. Tiếp theo tại UART.c e cũng thiết lập ngắt UART1 và UART2. Giả sử cấu hình toàn bộ UART1:
void u1a_open(void){
U1MODEbits.BRGH = 0; // set to standard speed mode
U1BRG = 31; // 115200 baud
U1MODEbits.PDSEL = 0b00; // 8-bit no parity
U1MODEbits.STSEL = 0; // 1 stop bit
IEC1bits.U1RXIE = 1; // recieve interrupt enable
IPC8bits.U1IP = 0; // priority 0
IPC8bits.U1IS = 3; // sub priority 3
U1STAbits.UTXISEL = 0; // interrupt when transmit complete
U1STAbits.URXISEL = 0; // interrupt generated with every reception
U1STAbits.URXEN = 1; // enable uart recieve
U1STAbits.UTXEN = 1; // enable uart transmit
U1MODEbits.ON = 1; // enable whole uart module
3. Sau khi thiết lập các ngắt xong em tạo file thực thi ngắt tên các ngắt được cấu trúc như sau: ví dụ ngắt timer4, với vector ngắt và mức ưu tiên ngắt đã được định nghĩa (em còn để thêm ngắt uart1 trong này, cấu trúc tương tự):
void __attribute((interrupt(ipl3), vector(_TIMER_4_VECTOR), nomips16)) timer4_int(void)
{
{
nội dung
}
IFS0CLR = 0x00000010; // Be sure to clear the Timer1 interrupt status
}
4. Sau khi build nó báo warning như thế này:
LIB\picmx150_it.c:30:1: warning: Interrupt priority IPL2 is deprecated. Specify as 'IPL2{AUTO|SOFT|SRS}' instead.
LIB\picmx150_it.c:37:1: warning: Interrupt priority IPL0 is deprecated. Specify as 'IPL0{AUTO|SOFT|SRS}' instead.
LIB\picmx150_it.c:46:1: warning: Interrupt priority IPL3 is deprecated. Specify as 'IPL3{AUTO|SOFT|SRS}' instead.
Các mức ngắt sẽ không được thực thi. Ai biết chỉ giúp em với ạ để các ngắt được xử lý theo đúng mức ưu tiên của nó. Em cảm ơn ạ!
1. Tại file main.c em thiết lập các ngắt cho timer2,3,4. Ví dụ timer 4.
//////////////// Timer4 config
T4CON = 0x0; // Stop the timer and clear the control register,
// prescaler at 1:1,internal clock source
TMR4 = 0x0; // Clear the timer register
PR4 =setPR(0.05); // Load the period register..50ms
IPC4bits.INT4IP=3;; // Set priority level = 3
IPC4bits.INT4IS=3; // Set subpriority level = 3
IFS0bits.INT4IF=0;// Clear the timer interrupt status flag
IEC0bits.INT4IE=0; // Enable timer interrupts
T4CONSET = 0x8000; // Start the timer
2. Tiếp theo tại UART.c e cũng thiết lập ngắt UART1 và UART2. Giả sử cấu hình toàn bộ UART1:
void u1a_open(void){
U1MODEbits.BRGH = 0; // set to standard speed mode
U1BRG = 31; // 115200 baud
U1MODEbits.PDSEL = 0b00; // 8-bit no parity
U1MODEbits.STSEL = 0; // 1 stop bit
IEC1bits.U1RXIE = 1; // recieve interrupt enable
IPC8bits.U1IP = 0; // priority 0
IPC8bits.U1IS = 3; // sub priority 3
U1STAbits.UTXISEL = 0; // interrupt when transmit complete
U1STAbits.URXISEL = 0; // interrupt generated with every reception
U1STAbits.URXEN = 1; // enable uart recieve
U1STAbits.UTXEN = 1; // enable uart transmit
U1MODEbits.ON = 1; // enable whole uart module
3. Sau khi thiết lập các ngắt xong em tạo file thực thi ngắt tên các ngắt được cấu trúc như sau: ví dụ ngắt timer4, với vector ngắt và mức ưu tiên ngắt đã được định nghĩa (em còn để thêm ngắt uart1 trong này, cấu trúc tương tự):
void __attribute((interrupt(ipl3), vector(_TIMER_4_VECTOR), nomips16)) timer4_int(void)
{
{
nội dung
}
IFS0CLR = 0x00000010; // Be sure to clear the Timer1 interrupt status
}
4. Sau khi build nó báo warning như thế này:
LIB\picmx150_it.c:30:1: warning: Interrupt priority IPL2 is deprecated. Specify as 'IPL2{AUTO|SOFT|SRS}' instead.
LIB\picmx150_it.c:37:1: warning: Interrupt priority IPL0 is deprecated. Specify as 'IPL0{AUTO|SOFT|SRS}' instead.
LIB\picmx150_it.c:46:1: warning: Interrupt priority IPL3 is deprecated. Specify as 'IPL3{AUTO|SOFT|SRS}' instead.
Các mức ngắt sẽ không được thực thi. Ai biết chỉ giúp em với ạ để các ngắt được xử lý theo đúng mức ưu tiên của nó. Em cảm ơn ạ!
Comment