以下代码基于雅特力AT32F407VGT7,只做思路分享,感兴趣的请根据自己的芯片来移植,不管你是什么32芯片,下面代码分三部分,io模拟串口发送字节函数,io引脚初始化函数,和main函数的调用测试。
下面的注释非常清楚的解释了波特率和IO电平的关系,有什么问题欢迎在评论区讨论。
#include "at32f403a_407_board.h"
/*io模拟串口 移植时根据自己的平台实现*/
#define GPIOx GPIOA
#define GPIO_PINS_x GPIO_PINS_7
#define Delay_us(us) delay_us(us)
#define Delay_ms(ms) delay_ms(ms)
#define Tx_Pin_High gpio_bits_write(GPIOx,GPIO_PINS_x,1)
#define Tx_Pin_Low gpio_bits_write(GPIOx,GPIO_PINS_x,0)
/*说明 如果为115200 延时时间为8us (==8.6)如果为115200 延时时间为9us (==8.6)
延时计算公式:baud_rate_delay = 1/BaudRate *1000000;
BaudRate | baud_rate_delay | 备注
256000 4 == 3.90625us //实测延时4us 匹配的波特率是230400 不是256000
128000 8 ==7.8us
115200 9 == 8.68us
57600 17 == 17.36us //实测17 18 这两延时 波特率57600\56000都识别出了
56000 18 == 17.85us
38400 26 == 26.04us
19200 52 == 52.08us
14400 69 == 69.44us
9600 104 == 104.16
4800 208 == 208.33
300 3333 == 3333.33
结论:其他未备注的波特率用对应baud_rate_delay延时测试发送OK
*/
//位延时时间, 改这里=改波特率
uint32_t baud_rate_delay = 3333;
/*io模拟串口 发送单个字节函数*/
static void io_to_uart_send_one_byte(char val)
{
uint8_t data_bit;
/*start bit level is low*/
Tx_Pin_Low;
/*one bit delay time*/
Delay_us(baud_rate_delay);
for(data_bit = 0; data_bit < 8; data_bit++)
{
if(val & 0x01)
/*bit 1*/
Tx_Pin_High;
else
/*bit 0*/
Tx_Pin_Low;
Delay_us(baud_rate_delay);
val >>= 1;
}
/*stop bit level is high*/
Tx_Pin_High;
Delay_us(baud_rate_delay);
}
/*io模拟串口 发送多个字节函数*/
void io_to_uart_send(unsigned char *buf, unsigned char len)
{
for(uint8_t i=0;i<len;i++)
{
io_to_uart_send_one_byte(buf[i]);
}
}
/*io模拟串口 tx 引脚初始化*/
void io_to_uart_pin_init(void)
{
gpio_init_type gpio_init_struct;
/* enable the tx pin clock GPIOA*/
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
/* set default parameter */
gpio_default_para_init(&gpio_init_struct);
/* configure PA.7 as with output pull-up */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_7;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA, &gpio_init_struct);
}
int main(void)
{
uint8_t tmp_buf[10] = {0,1,2,3,4,5,6,7,8,9};
system_clock_config();
at32_board_init();
io_to_uart_pin_init();
while(1)
{
io_to_uart_send(tmp_buf,10);
delay_ms(500);
}
}