STM32
直播中

李静

7年用户 1011经验值
私信 关注
[问答]

如何使用库函数设置STM8S0003使能串口接收中断?

大家好!

           我用一颗STM8S003 的芯片连接一个串口的WIFI 模块, 我想使能STM8 串口接收中断。

           具体做法如下:

          1.  初始化  时钟和串口:

void main()
{
    My_CLK_Config(); // 初始化时钟
    disableInterrupts(); // 关闭中断
    UART1_DeInit();    //复位UART1
    UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D,UART1_STOPBITS_1, UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);    // 配置串口
    UART1_ITConfig(UART1_IT_RXNE,ENABLE);       //配置串口1的接收中断
    enableInterrupts();   // 开启中断
    while (1)
    { }
}

         2. 设置中断向量 表:
extern void _stext();     /* startup routine */
extern @far @interrupt void UART1_RX_IRQHandler(void);
extern @far @interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void);
extern @far @interrupt void EXTI_PORTD_IRQHandler(void);
extern @far @interrupt void EXTI_PORTC_IRQHandler(void);
struct interrupt_vector const _vectab[] = {
    {0x82, (interrupt_handler_t)_stext}, /* reset */
    {0x82, NonHandledInterrupt}, /* trap  */
    {0x82, NonHandledInterrupt}, /* irq0  */
    {0x82, NonHandledInterrupt}, /* irq1  */
    {0x82, NonHandledInterrupt}, /* irq2  */
    {0x82, NonHandledInterrupt}, /* irq3  */
    {0x82, NonHandledInterrupt}, /* irq4  */
    {0x82, (interrupt_handler_t)EXTI_PORTC_IRQHandler}, /* irq5  */
    {0x82, (interrupt_handler_t)EXTI_PORTD_IRQHandler}, /* irq6  */
    {0x82, NonHandledInterrupt}, /* irq7  */
    {0x82, NonHandledInterrupt}, /* irq8  */
    {0x82, NonHandledInterrupt}, /* irq9  */
    {0x82, NonHandledInterrupt}, /* irq10 */
    {0x82, NonHandledInterrupt}, /* irq11 */
    {0x82, NonHandledInterrupt}, /* irq12 */
    {0x82, (interrupt_handler_t)TIM2_UPD_OVF_BRK_IRQHandler}, /* irq13 */
    {0x82, NonHandledInterrupt}, /* irq14 */
    {0x82, NonHandledInterrupt}, /* irq15 */
    {0x82, NonHandledInterrupt}, /* irq16 */
    {0x82, NonHandledInterrupt}, /* irq17 */
    {0x82, (interrupt_handler_t)UART1_RX_IRQHandler}, /* irq18 */

        完成以上操作后, 我在main 文件中 串口中断 入口 打了断点:   但是电脑串口发送数据到STM8,断点没有停止。
        请问以上设置有没有遗漏的?

@far @interrupt void UART1_RX_IRQHandler(void)
{   
    if(UART1->SR UART1_FLAG_RXNE)
    {
        rxbuf[rx_num++]=UART1_ReceiveData8();
        UART1_SendData8(UART1_ReceiveData8());
     }
}








回帖(1)

李娟

2024-5-13 17:30:16
大家好!根据您的描述,您想要使用STM8S003芯片与一个串口WIFI模块通信,并使能STM8串口接收中断。以下是详细的步骤:

1. 初始化时钟和串口:
```c
void main(){
    My_CLK_Config();  // 初始化时钟
    disableInterrupts(); // 关闭中断
    CLK_PeripheralClockConfig(CLK_Peripheral_UART1, ENABLE); // 使能UART1时钟
    UART1_DeInit();  // 复位UART1
    UART1_Init((uint32_t)115200, UART1_WordLength_8D, UART1_StopBits_1, UART1_Parity_No);
}
```

2. 配置串口接收中断:
```c
void UART1_Config(void) {
    UART1_ITConfig(UART1_IT_RXNE, ENABLE); // 使能接收中断
    UART1_Cmd(ENABLE); // 使能UART1
    enableInterrupts(); // 使能中断
}
```

3. 在主函数中调用配置函数:
```c
void main() {
    // ...(之前的初始化代码)
    UART1_Config(); // 配置串口接收中断
    // ...(其他代码)
}
```

4. 实现串口接收中断服务程序:
```c
void UART1_IRQHandler(void) interrupt 4 using 1 {
    if (UART1_GetFlagStatus(UART1_FLAG_RXNE) != RESET) {
        uint8_t data = UART1_ReceiveData8(); // 读取接收到的数据
        // 处理接收到的数据
        UART1_ClearFlag(UART1_FLAG_RXNE); // 清除接收中断标志
    }
}
```

5. 在您的代码中,处理接收到的数据。例如,您可以将数据存储在一个数组中,或者根据数据执行特定的操作。

请注意,您可能需要根据您的具体需求调整时钟配置、波特率等参数。希望这些步骤对您有所帮助!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分