闲言少叙,先上代码,大家看下面这段代码没有问题?
// note: usart demo code runs on stm32f030
#include main.h
static __io uint32_t timingdelay;
rcc_clockstypedef rcc_clocks;
uint8_t uart_buffer;
// gpio configuration
void gpio_configuration(void)
{
gpio_inittypedef gpio_initstructure;
gpio_pinafconfig(gpioa,gpio_pinsource9,gpio_af_1); // tx pa9
gpio_pinafconfig(gpioa,gpio_pinsource10,gpio_af_1); // rx pa10
gpio_initstructure.gpio_pin = gpio_pin_9 | gpio_pin_10; // usart1_tx | usart1_rx
gpio_initstructure.gpio_mode = gpio_mode_af;
gpio_initstructure.gpio_otype = gpio_otype_pp;
gpio_initstructure.gpio_pupd = gpio_pupd_up;
gpio_initstructure.gpio_speed = gpio_speed_level_1;
gpio_init(gpioa, &gpio_initstructure);
}
// usart configuration
void usart_configuration(void)
{
usart_inittypedef usart_initstructure;
usart_initstructure.usart_baudrate = 115200;
//usart_initstructure.usart_baudrate = 9600;
usart_initstructure.usart_wordlength = usart_wordlength_8b;
usart_initstructure.usart_stopbits = usart_stopbits_1;
usart_initstructure.usart_parity = usart_parity_no;
usart_initstructure.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
usart_initstructure.usart_mode = usart_mode_tx | usart_mode_rx;
usart_init(usart1,&usart_initstructure);
usart_itconfig(usart1, usart_it_rxne, enable);
usart_cmd(usart1,enable);
}
// interrupt configuration
void nvic_configuration(void)
{
nvic_inittypedef nvic_initstructure;
// usart1 interrupt config
nvic_initstructure.nvic_irqchannel = usart1_irqn;
nvic_initstructure.nvic_irqchannelpriority = 0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
}
// usart1 interrupt handler
void usart1_irqhandler (void)
{
static uint8_t i = 0;
if(usart_getitstatus(usart1,usart_it_rxne)!= reset)
{// clear receive data register not empty flag
usart_clearitpendingbit(usart1,usart_it_rxne);
uart_buffer[i++] = usart_receivedata(usart1);
if(i == 100)
i = 0;
}
}
int main(void)
{
static uint8_t ch;
// init a 1ms timer interrupt, for delay function implementation.
rcc_getclocksfreq(&rcc_clocks);
systick_config(rcc_clocks.hclk_frequency / 1000);
// enable usart1 and gpioa clock
rcc_apb2periphclockcmd(rcc_apb2periph_usart1,enable);
rcc_ahbperiphclockcmd(rcc_ahbperiph_gpioa,enable);
gpio_configuration();
usart_configuration();
nvic_configuration();
ch = 'a';
while(1)
{
delay(50);
while(usart_getflagstatus(usart1, usart_flag_txe) == reset);
usart_senddata(usart1, ch);
ch++;
}
}
/**
* @brief inserts a delay time.
* @param ntime: specifies the delay time length, in 1 ms.
* @retval none
*/
void delay(__io uint32_t ntime)
{
timingdelay = ntime;
while(timingdelay != 0);
}
/**
* @brief decrements the timingdelay variable.
* @param none
* @retval none
*/
void timingdelay_decrement(void)
{
if(timingdelay != 0x00)
{
timingdelay--;
}
}
它可以在 stm32f030 上调试通过的发送测试程序,发送采用接收循环,接收到接收的数据存入协议。
有很多比较认真的实战派的同学估计会下载子上跑一跑,它确实能跑通,看起来也没什么问题。很多教程甚至官方的都是类似的处理方法。
这确实是在某个像马坑里有马儿跑出来的马儿,然后跑着一个人跑出来,跑出来连挖挖挖出来。 ,莫名更新了它的死机。查来查去,查去查来,发现问题。解决起来不容易啊,一个去开,拆代码,想都。。。
所以同学们不要轻视任何一段代码啊!
非常快的时候,如果对方接收到数据的时候,可以自己发送接收数据的时间,或者对方正在发送的数据发送给对方。 ,会导致超出标志位的置位。这个标志位一置,原来就乱了。所以,在程序中一定要对异常情况的处理。甚至觉得发生的异常也不要置之不理。(一想为什么要填充flash的空白区域?在正常情况代码永远不会跑到空白区域下是吧。)
对串口异常的处理也可以参考下面的处理函数。当然可以在主程序中处理,以便在代码中断的情况下正常运行。
// usart1 interrupt handler
void usart1_irqhandler (void)
{
static uint8_t i = 0;
if(usart_getflagstatus(usart1, usart_flag_ore) != reset)
{// clear overrun error flag
usart_clearflag(usart1, usart_flag_ore);
}
else if(usart_getflagstatus(usart1, usart_flag_ne) != reset)
{// clear noise error flag
usart_clearflag(usart1, usart_flag_ne);
}
else if(usart_getflagstatus(usart1, usart_flag_fe) != reset)
{// clear framing error flag
usart_clearflag(usart1, usart_flag_fe);
}
else if(usart_getflagstatus(usart1, usart_flag_pe) != reset)
{// clear parity error flag
usart_clearflag(usart1, usart_flag_pe);
}
else if(usart_getitstatus(usart1,usart_it_rxne)!= reset)
{// clear receive data register not empty flag
usart_clearitpendingbit(usart1,usart_it_rxne);
uart_buffer[i++] = usart_receivedata(usart1);
if(i == 100)
i = 0;
}
}
针对CDMA系统功率控制算法进行分析
学Qt,此问题必解!
可实现测量幅度和相位差的AD8302芯片的性能特点和应用分析
上海移动携手华为首次将5G系列化应用场景带入到了营业厅
工业控制系统信息库如何防范安全问题
单片机如何才能不死机之Overrun
三星note8和小米mix2对比评测,谁的颜值更高
后浪滚滚,防盗报警前辈“安定宝”如何“乘风破浪”?
带超低IQ和高效开关稳压器的PMIC应用方案分析
2020款iPhone有望搭载LG柔性屏幕
电机基本参数怎么测量?
MAX1284, MAX1285,MAX1285B串行12位ADC,内置电压基准
51单片机上实现的交通灯程序
PIC单片机与MCS-51单片机有什么区别
安超云参与编写的《中国多云管理平台发展洞察报告(2023)》正式发布!
vivo X21世界杯非凡版5月26日正式上市销售 定价为3698元
关于JVM的调优知识
XGBoost中无需手动编码的分类特征
Hinton:如何开发人工智能的好处,同时尽量减少失业和算法歧视等不利因素
如何鉴别有线电视电缆接头的优劣