OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3957|回复: 3

我这段串口通信的代码为什么运行没效果(要是添加了原子提供的SYSTEM文件夹中的代码就有效果,但是我没调用过那里面的函数)

[复制链接]

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2015-3-16 21:52:44 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include <misc.h> #include <core_cm3.h> #include <stm32f10x.h> #include <stdio.h> void led_init() { GPIO_InitTypeDef initType; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); initType.GPIO_Mode = GPIO_Mode_Out_PP; initType.GPIO_Pin = GPIO_Pin_2; initType.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&initType); initType.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOA,&initType); } void led_on() { GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_RESET); } void led_off() { GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_SET); } void myuart_init() { GPIO_InitTypeDef gpio; USART_InitTypeDef usart; NVIC_InitTypeDef nvic; //GPIO时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //串口时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口复位 USART_DeInit(USART1); gpio.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出 gpio.GPIO_Pin = GPIO_Pin_9; //TXD gpio.GPIO_Speed = GPIO_Speed_10MHz; //GPIO初始化 GPIO_Init(GPIOA,&gpio); gpio.GPIO_Pin = GPIO_Pin_10; //RXD gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 //GPIO初始化 GPIO_Init(GPIOA,&gpio); usart.USART_BaudRate = 9600; usart.USART_WordLength = USART_WordLength_8b; usart.USART_StopBits = USART_StopBits_1; usart.USART_Parity = USART_Parity_No; usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None; usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 //串口初始化 USART_Init(USART1,&usart); nvic.NVIC_IRQChannel = USART1_IRQn; nvic.NVIC_IRQChannelCmd = ENABLE; nvic.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级 nvic.NVIC_IRQChannelSubPriority = 3; //子优先级 //初始化 NVIC NVIC_Init(&nvic); //开启中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口 USART_Cmd(USART1,ENABLE); } void USART1_IRQHandler() { if( RESET != USART_GetITStatus(USART1,USART_IT_RXNE) ) { u8 data = USART_ReceiveData(USART1); //USART_SendData(USART1,data); if(data == 48) //ascii 码 0 { led_on(); } if(data == 49) //ascii 码 1 { led_on(); } printf("receive data: %d",data); } } int main(void) { led_init(); myuart_init(); led_on(); while(1) { } //return 0; }[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

SYSYTEM文件夹里的代码默认初始化了串口1,并且支持printf函数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2015-3-16 21:52:45 | 显示全部楼层
SYSYTEM文件夹里的代码默认初始化了串口1,并且支持printf函数
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
 楼主| 发表于 2015-3-16 21:52:45 | 显示全部楼层
解决了,注释掉这句就行了。

 printf("receive data: %d",data);
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
 楼主| 发表于 2015-3-16 21:58:02 | 显示全部楼层
现在要注释掉中断服务函数和 main 函数中 myuart_init();函数调用才能正确执行程序。这是为什么?还有就是为什么添加了 SYSTEM 文件夹中提供的代码就能运行了,我也没调用里面的函数啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 00:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表