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

STM32F107VCT6 串口(USART2)通讯的问题

[复制链接]
Wolf-2037309 提问时间:2013-9-4 17:26 /
哪位大神帮小弟弟看看程序,程序烧进去后串口的数据是:F6  F4 ,小弟不解请求大神帮忙看看 ,谢谢!
程序如下:
#include "stm32f10x.h"
#include
 
#define GPIO_LED1                                    GPIO_Pin_2   
#define GPIO_LED2                                    GPIO_Pin_3   
#define GPIO_LED3                                    GPIO_Pin_4   
#define GPIO_LED4                                    GPIO_Pin_7
#define GPIO_LED_ALL                                 GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
#define UART2_TX_IO                                  GPIO_Pin_5
#define UART2_RX_IO                                  GPIO_Pin_6
void Init(void);
void InitClock(void);
void InitGPIO(void);
void InitUart(void);
void Delayms(u32 Z);
void Delayus(u32 Z);
void FailCLKInit(void);
void UartSendChar(u8 TXBuf);
void UartSendString(const  u8 *ADDPointer);
void UartReceiveChar(u8 RXBuf)  ;

int main(void)
{
 Init();
 while(1)
 {
  
   GPIO_SetBits(GPIOD , GPIO_LED_ALL);
   UartSendChar(0x38);
   Delayms(800);     
   GPIO_ResetBits(GPIOD , GPIO_LED_ALL); 
   UartSendChar(0x31);
   Delayms(800);   
 }
}
void Init(void)
{
 InitClock() ;
 InitGPIO();
    InitUart();
 
}
void InitClock(void)
{
 RCC_DeInit();                    
 RCC_HSEConfig(RCC_HSE_ON);               // HSE = 25MHz
 if(SUCCESS == RCC_WaitForHSEStartUp()) 
 {
 
 // FLASH_PrefetchBufferCmd(ENABLE);     //  ??
    //    FLASH_SetLatency(FLASH_Latency_2);       
  RCC_HCLKConfig(RCC_SYSCLK_Div1);        // AHB CLOCK(HCLK) = SYSTEM CLOCK /1
  RCC_PCLK1Config(RCC_HCLK_Div2);        // APB1 CLOCK = HCK/2      max 36MHz
     RCC_PCLK2Config(RCC_HCLK_Div1);        // APB2 CLOCK = HCK/1  max 72MHz
     // debug
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);  // PLLSOURCECLK = HSECLK/1 ,  PLLCLKOUT = SOURCECLK *2
  RCC_PLLCmd(ENABLE);                            //  START PLL
  while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY));  // WAIT PLLCLK READY  
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);          //SYSTEMCLK = PLLCLKOUT      25*2 = 50 MHz
  while(RCC_GetSYSCLKSource() != 0x08) ;               // WAIT SYSTEMCLK = PLLCLKOUT SUCCESFUL
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
 } 
 else
  FailCLKInit();                  
  
}
void InitGPIO(void)
{
 GPIO_InitTypeDef GPIOD_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); // ENABLE GPIOD CLOCK
 
 GPIOD_InitStructure.GPIO_Pin = GPIO_LED_ALL;
    GPIOD_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // PUSH-PULL  OUTPUT
    GPIO_Init(GPIOD, &GPIOD_InitStructure);
 GPIOD_InitStructure.GPIO_Pin = UART2_TX_IO;
    GPIOD_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // PUSH-PULL  OUTPUT
    GPIO_Init(GPIOD, &GPIOD_InitStructure);
 GPIOD_InitStructure.GPIO_Pin = UART2_RX_IO;
    GPIOD_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  // PUSH-PULL  INPUT
    GPIO_Init(GPIOD, &GPIOD_InitStructure);
    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE) ; // REMAP GPIO
 GPIO_SetBits(GPIOD , GPIO_LED_ALL);      // LED OFF
   
}
void FailCLKInit(void)
{
}
void InitUart(void)
{
 USART_InitTypeDef  USART2_InitStructure;
 float temp;
    u16 mantissa;
     u16 fraction;   
      temp=(float)(25*1000000)/(115200*16);//得到USARTDIV
      mantissa=temp;     //得到整数部分
      fraction=(temp-mantissa)*16; //得到小数部分 
        mantissaDR  =  TXBuf ;
 while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC));
// USART_ClearFlag(USART2,USART_FLAG_TC);
 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
void UartSendString(const  u8 *ADDPointer)
{
}
void UartReceiveChar(u8 RXBuf) 
{

}
void Delayms(u32 Z)
{
 while(Z--)
  Delayus(1000); 
}
void Delayus(u32 Z)   // SYSCLK = HCLK = 25MHz *2  , MAX Z=  0X00FFFFFF/50 =  335 544
{
 SysTick->LOAD=50*Z;                      //装载计数值,因为时钟50M,50次才1μs 
    SysTick->CTRL=0x00000005;                //时钟来源设为HCLK=50MHz,禁止异常中断请求,打开定时器
    while(!(SysTick->CTRL&0x00010000));      //等待计数到0
    SysTick->CTRL=0x00000000;                //关闭定时器
}
/****************************** Interrupt **************************/

 
<
收藏 评论7 发布时间:2013-9-4 17:26

举报

7个回答
fengye5340 回答时间:2013-9-5 14:56:13

RE:STM32F107VCT6 串口(USART2)通讯的问题

//USART2_InitStructure.USART_BaudRate = 9600;        
// 115200 ,N ,1
USART2-&gt;BRR= mantissa ;
这两句改一下,改成
USART2_InitStructure.USART_BaudRate = 115200;        
// 115200 ,N ,1
// USART2-&gt;BRR= mantissa ;

void UartSendChar(u8 TXBuf)
{
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC));
// USART_SendData(USART2,TXBuf);
USART2-&gt;DR  =  TXBuf ;
while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC));
// USART_ClearFlag(USART2,USART_FLAG_TC);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
这个函数内容改一下,改成下面的内容,再试试吧
void UartSendChar(u8 TXBuf)
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);       
USART_SendData(USART2,TXBuf);  

}
feiante-155820 回答时间:2013-9-5 17:44:33

RE:STM32F107VCT6 串口(USART2)通讯的问题

如果要发送字符串,可以用
void send_str_usart2(unsigned char *p,unsigned char len)
{
        unsigned char i;
        for (i=0; i
feiante-155820 回答时间:2013-9-5 17:44:55

RE:STM32F107VCT6 串口(USART2)通讯的问题

如果要发送字符串,可以用
void send_str_usart2(unsigned char *p,unsigned char len)
{
        unsigned char i;
        for (i=0; i
Wolf-2037309 回答时间:2013-9-5 18:07:35

回复:STM32F107VCT6 串口(USART2)通讯的问题

回复第 2 楼 于2013-09-05 14:56:13发表:
//USART2_InitStructure.USART_BaudRate = 9600;
// 115200 ,N ,1
USART2-&gt;BRR= mantissa ;
这两句改一下,改成
USART2_InitStructure.USART_BaudRate = 115200;
// 115200 ,N ,1
// USART2-&gt;BRR= mantissa ;

void UartSendChar(u8 TXBuf)
{
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC));
// USART_SendData(USART2,TXBuf);
USART2-&gt;DR = TXBuf ;
while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC));
// USART_ClearFlag(USART2,USART_FLAG_TC);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
这个函数内容改一下,改成下面的内容,再试试吧
void UartSendChar(u8 TXBuf)
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2,TXBuf);

}
 

谢谢您的回复!按照你说的 我改了一下, 可串口一直发 FF 与 FD (二进制显示接收的)
Wolf-2037309 回答时间:2013-9-5 18:09:16

回复:STM32F107VCT6 串口(USART2)通讯的问题

回复第 3 楼 于2013-09-05 17:44:33发表:
如果要发送字符串,可以用
void send_str_usart2(unsigned char *p,unsigned char len)
{
unsigned char i;
for (i=0; i {
USART_SendData(USART2,*p);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
p++;
}
}
给个例子:send_str_usart1(water_temp,sizeof water_temp);
其中water_temp存放你要发送的数据的数组。 

谢谢您的回复! 现在是串口发的数据不对,不知道哪儿出问题了
Wolf-2037309 回答时间:2013-9-11 14:39:56

RE:STM32F107VCT6 串口(USART2)通讯的问题

问题已经解决,STM32 头文件很重要。
妮子-2054678 回答时间:2014-1-6 15:20:41

回复:STM32F107VCT6 串口(USART2)通讯的问题

回复第 7 楼 于2013-09-11 14:39:56发表:
问题已经解决,STM32 头文件很重要。 

是不是时钟没有配置好啊。我也遇到问题了,请教啊

所属标签

相似问题

官网相关资源

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