因为芯片串口不够用,只好用io口模拟串口,在网上下载了个模拟串口的程序,可运行,但发现串口输出隔几个字符就会出现乱码,主要部分代码如下:
[cpp] view plain copy#define oi_txd paout(12)
#define oi_rxd pain(11)
#define buadrate_9600 100
u8 len = 0; //接收计数
u8 usart_buf[11]; //接收缓冲区
u8 recvstat = com_stop_bit;
u8 recvdata = 0;
void io_txd(u8 data)
{
u8 i = 0;
oi_txd = 0;
delay_us(buadrate_9600);
for(i = 0; i 《 8; i++)
{
if(data&0x01)
oi_txd = 1;
else
oi_txd = 0;
delay_us(buadrate_9600);
data = data》》1;
}
oi_txd = 1;
delay_us(buadrate_9600);
}
void usart_send(u8 *buf, u8 len)
{
u8 t;
for(t = 0; t 《 len; t++)
{
io_txd(buf[t]);
}
}
void ioconfig(void)
{
gpio_inittypedef gpio_initstructure;
nvic_inittypedef nvic_initstructure;
exti_inittypedef exti_initstruct;
rcc_apb2periphclockcmd(rcc_apb2periph_afio|rcc_apb2periph_gpioa, enable); //使能pb,pc端口时钟
//software serial txd
gpio_initstructure.gpio_pin = gpio_pin_12;
gpio_initstructure.gpio_mode = gpio_mode_out_pp; //推挽输出
gpio_initstructure.gpio_speed = gpio_speed_50mhz; //io口速度为50mhz
gpio_init(gpioa, &gpio_initstructure);
gpio_setbits(gpioa,gpio_pin_12);
//software serial rxd
gpio_initstructure.gpio_pin = gpio_pin_11;
gpio_initstructure.gpio_mode = gpio_mode_ipu;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioa, &gpio_initstructure);
gpio_extilineconfig(gpio_portsourcegpioa, gpio_pinsource11);
exti_initstruct.exti_line = exti_line11;
exti_initstruct.exti_mode=exti_mode_interrupt;
exti_initstruct.exti_trigger=exti_trigger_falling; //下降沿触发中断
exti_initstruct.exti_linecmd=enable;
exti_init(&exti_initstruct);
nvic_initstructure.nvic_irqchannel= exti15_10_irqn ;
nvic_initstructure.nvic_irqchannelpreemptionpriority=2;
nvic_initstructure.nvic_irqchannelsubpriority =2;
nvic_initstructure.nvic_irqchannelcmd=enable;
nvic_init(&nvic_initstructure);
}
[cpp] view plain copyint main(void)
{
delay_init();
ioconfig();
while(1)
{
usart_send(“100”,3);
delay_ms(100);
}
一般出现输出乱码,可能是输出部分延时不够造成的,于是检查输出部分使用延时的情况,发现usart_send中没有用到延时,所在在usart_send中加入一个1ms的延时,错误解除,改过的代码如下:
[cpp] view plain copyvoid usart_send(u8 *buf, u8 len)
{
u8 t;
for(t = 0; t 《 len; t++)
{
io_txd(buf[t]);
delay_ms(1);
}
}
延时虽然简单,但有时真的会发挥很大的作用。
iW3662和iW3688加持,Dialog在照明领域再上新台阶
发烧耳机基础知识
微型断路器的原理说明
吴恩达:模拟人脑,未来AI执行精神层面任务有望快过人类!
基于STM32G4芯片的DAC应用示例分享
STM32中IO口模拟串口输出的乱码现象
某电磁炉热敏电阻测温原理图
魅族将于8月28日正式发布魅族16s Pro手机和全新配件品牌lifeme
工业互联网总体网络架构国家标准正式发布
索尼中国官方上线PS5国行版预告页
实现自动驾驶宏图需着眼于当前机遇
焊接机械手在焊接作业中的优势是什么
Realme将在印度尼西亚推出Realme 7i和Realme 7智能手机
电容串联和并联的区别
中国移动OneNET击穿智能家电成本底线
基于分裂式ADC的LMS算法实现数字后台校正
电动车常见问题和处理
智慧公安是智慧城市建设的突破口
Zytronic Displays 在深圳数字广告牌会议展示其独有投射电容式技术
二次雷达接收系统设计及幅相处理