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

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->BRR= mantissa ;
这两句改一下,改成
USART2_InitStructure.USART_BaudRate = 115200;        
// 115200 ,N ,1
// USART2->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->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->BRR= mantissa ;
这两句改一下,改成
USART2_InitStructure.USART_BaudRate = 115200;
// 115200 ,N ,1
// USART2->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->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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版