用stm8s208mb写串口中断收发程序
时间: 2023-06-23 18:09:47 浏览: 49
下面是一个基本的STM8串口收发程序,使用中断方式:
```c
#include <stm8s.h>
#define UART_TX_PIN GPIO_PIN_3
#define UART_RX_PIN GPIO_PIN_2
void uart_init(void);
void uart_send_byte(uint8_t data);
void uart_send_string(char *str);
uint8_t uart_receive_byte(void);
void main(void)
{
CLK_CKDIVR = 0x00; // 16MHz
uart_init();
enableInterrupts();
while (1)
{
// 主程序内容
}
}
void uart_init(void)
{
// 配置串口引脚
GPIOC->DDR |= UART_TX_PIN;
GPIOC->CR1 |= UART_TX_PIN;
GPIOC->CR2 |= UART_TX_PIN;
GPIOC->DDR &= ~UART_RX_PIN;
GPIOC->CR1 |= UART_RX_PIN;
GPIOC->CR2 |= UART_RX_PIN;
// 配置波特率
UART1_BRR2 = 0x03;
UART1_BRR1 = 0x68;
// 配置控制寄存器
UART1_CR1 = UART1_CR1_M | UART1_CR1_RXNEIE;
UART1_CR2 = 0x00;
UART1_CR3 = UART1_CR3_STOP1;
}
void uart_send_byte(uint8_t data)
{
while (!(UART1_SR & UART1_SR_TXE));
UART1_DR = data;
}
void uart_send_string(char *str)
{
while (*str)
{
uart_send_byte(*str++);
}
}
uint8_t uart_receive_byte(void)
{
while (!(UART1_SR & UART1_SR_RXNE));
return UART1_DR;
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
while (1);
}
#endif
// 中断服务程序
#ifdef _COSMIC_
@far @interrupt void UART1_RX_IRQHandler(void)
#else /* _RAISONANCE_ */
void UART1_RX_IRQHandler(void) interrupt 18
#endif
{
uint8_t data = uart_receive_byte();
uart_send_byte(data);
}
```
上述程序中,我们使用了`UART1`模块和`PC2`和`PC3`两个引脚进行串口收发。在`uart_init()`函数中,我们配置了波特率、控制寄存器,并开启了接收中断。在`uart_send_byte()`函数中,我们等待发送寄存器为空,然后将数据写入发送寄存器。在`uart_send_string()`函数中,我们循环调用`uart_send_byte()`函数,将字符串中的每个字符依次发送出去。在`uart_receive_byte()`函数中,我们等待接收寄存器非空,然后读取接收寄存器中的数据。最后,在中断服务程序中,我们读取接收寄存器中的数据,并将其通过串口发送回去。
注意:上述代码仅供参考,具体实现可能需要根据自己的具体需求进行修改。