stm8 基于寄存器的485程序
时间: 2023-08-02 14:12:59 浏览: 87
以下是基于寄存器的STM8的485程序示例:
```c
#include <stm8s.h>
#define TX_PIN GPIO_PIN_3
#define RX_PIN GPIO_PIN_2
void delay_us(uint16_t us)
{
while(us--)
{
__asm__("nop");
}
}
void UART_Init(void)
{
// Configure UART1 TX pin as output push-pull high-speed
GPIO_Init(TX_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
// Configure UART1 RX pin as input floating
GPIO_Init(RX_PIN, GPIO_MODE_IN_FL_NO_IT);
// Set UART1 baud rate to 9600 baud
UART1_Init(9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
// Enable UART1 receiver
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
// Enable UART1
UART1_Cmd(ENABLE);
}
void RS485_Transmit_Enable(void)
{
// Set TX pin high
GPIO_WriteHigh(TX_PIN);
// Delay for at least 2-bit times
delay_us(200);
// Enable transmit mode
UART1->CR2 |= UART1_CR2_TEN;
}
void RS485_Transmit_Disable(void)
{
// Disable transmit mode
UART1->CR2 &= ~UART1_CR2_TEN;
// Delay for at least 2-bit times
delay_us(200);
// Set TX pin low
GPIO_WriteLow(TX_PIN);
}
void RS485_Send_Byte(uint8_t byte)
{
// Wait for transmitter to be ready
while (!(UART1->SR & UART1_SR_TXE));
// Send byte
UART1->DR = byte;
}
void RS485_Send_Data(uint8_t *data, uint8_t len)
{
// Enable transmit mode
RS485_Transmit_Enable();
// Send data
for (uint8_t i = 0; i < len; i++)
{
RS485_Send_Byte(data[i]);
}
// Disable transmit mode
RS485_Transmit_Disable();
}
int main(void)
{
uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
// Initialize UART and RS485 driver
UART_Init();
while(1)
{
// Send data over RS485
RS485_Send_Data(data, sizeof(data));
// Delay for a short period
delay_us(100);
}
}
```
这个示例程序初始化了UART1,设置了TX和RX引脚的模式,并定义了一些RS485相关的函数。在主循环中,它发送了一个包含四个字节的数组,然后等待一段时间,然后重复该过程。注意,在发送数据之前,必须先使能RS485的发送模式,然后在发送完成后再将其禁用。