你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

我这个stm32f030k6t6的串口配置下载后串口助手没有数据打印

[复制链接]
axcasf 提问时间:2019-5-22 23:34 /
悬赏1ST金币未解决
#include "stm32f0xx.h"
#include "uart.h"
#include "string.h"
#include "stdlib.h"
//////////////////////////////////////////////////////////////////////////////////   
//如果使用ucos,则包括下面的头文件即可.
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
int handle;
};
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{  
while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
USART1->RDR = (uint8_t) ch;      
return ch;
}
#endif

//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   
uint8_t USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
uint16_t USART_RX_STA=0;       //接收状态标记
//初始化IO 串口1
//bound:波特率
void uart_init(uint32_t bound){
   //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_1); //GPIOB6复用为USART1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_1); //GPIOB7复用为USART1

//USART1端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //GPIOB6与GPIOB7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB6,PB7

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、

   //USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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_Rx | USART_Mode_Tx; //收发模式
  USART_Init(USART1, &USART_InitStructure); //初始化串口1、

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

  USART_Cmd(USART1, ENABLE);  //使能串口1

//USART_ClearFlag(USART1, USART_FLAG_TC);

}
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
uint8_t Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
  Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
  
  if((USART_RX_STA&0x8000)==0)//接收未完成
  {
   if(USART_RX_STA&0x4000)//接收到了0x0d
   {
    if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x8000; //接收完成了
   }
   else //还没收到0X0D
   {
    if(Res==0x0d)USART_RX_STA|=0x4000;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
     USART_RX_STA++;
     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   
    }   
   }
  }      
  }
}
//////////////////////////////////////////////
//主函数
#include "stm32f0xx.h"
#include "delay.h"
#include "uart.h"
#include "pwm.h"
int v=300;//占空比,绝对值最大500
int main(void)
{
delay_init(48);
uart_init(115200);
//  TIM_PWM_Config(999,24-1);//频率5KHz
//// pwmout(v);
// TIM_SetCompare1(TIM1,v);
// TIM_SetCompare2(TIM1,v);
  while (1)
  {
  
//  delay_ms(500);
// printf("aa\r\n");
  USART_SendData(USART1,0x31);
}
}

收藏 评论8 发布时间:2019-5-22 23:34

举报

8个回答
edmundlee 回答时间:2019-5-22 23:54:42
USART1->RDR = (uint8_t) ch;    ???
TDR
axcasf 回答时间:2019-5-23 00:05:28
edmundlee 发表于 2019-5-22 23:54
USART1->RDR = (uint8_t) ch;    ???
TDR

谢谢您的回复,但是我主函数里发送是直接用的库函数USART_SendData。这里虽然有问题,但是并不会影响USART_SendData函数。而且我也试了,还是不行。
子曰好人 回答时间:2019-5-23 08:45:53
axcasf 发表于 2019-5-23 00:05
谢谢您的回复,但是我主函数里发送是直接用的库函数USART_SendData。这里虽然有问题,但是并不会影响USAR ...

沙发层主的意思是你写错寄存器了,应该用TDR这个寄存器,而不是RDR

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

axcasf 回答时间:2019-5-23 10:05:47
子曰好人 发表于 2019-5-23 08:45
沙发层主的意思是你写错寄存器了,应该用TDR这个寄存器,而不是RDR

我改了这个错了,但是还是不行
子曰好人 回答时间:2019-5-23 13:38:21
axcasf 发表于 2019-5-23 10:05
我改了这个错了,但是还是不行

我看了我之前的重定向fput代码,是下面这样,唯一的区别就是我用的DR寄存器,你改成这样试试

  1. int fputc(int ch, FILE *f)
  2. {      
  3.         while((USART1->SR&0X40)==0);//
  4.     USART1->DR = (u8) ch;      
  5.         return ch;
  6. }
复制代码
axcasf 回答时间:2019-5-23 17:42:14
子曰好人 发表于 2019-5-23 13:38
我看了我之前的重定向fput代码,是下面这样,唯一的区别就是我用的DR寄存器,你改成这样试试
...

不行的,f030的串口数据寄存器分为发送数据寄存器TDR和接收数据寄存器RDR
edmundlee 回答时间:2019-5-24 00:03:51
说实在的,查错是通过断点,查看寄存器等手段找出错误之处。
如果只靠翻来覆去查看代码哪儿写错, 那不叫查错, 叫检漏。

比如说, 你在 fputc 的进入点设个断点, 会不会停在这断点的结果,就能把问题范围缩小。
如果说会停在断点, 就是重定向没问题, 问题只在USART的配置
否则就是重定向的问题



评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

axcasf 回答时间:2019-5-24 00:32:22
edmundlee 发表于 2019-5-24 00:03
说实在的,查错是通过断点,查看寄存器等手段找出错误之处。
如果只靠翻来覆去查看代码哪儿写错, 那不叫查 ...

谢谢您的回复,我会好好去试一试的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版