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

STM8L051F3串口调试不通

[复制链接]
HYP 提问时间:2016-12-1 15:29 /
最近刚刚接触stm8,在使用串口的时候,死活的调试不通,请教万能的大神们
串口配置
void Uart1_Init(void)
{
          CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
        GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD
          GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD
           GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2, ENABLE);
                  GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_3, ENABLE);
          USART_DeInit(USART1);                //复位UART1
        /*
         * 将UART1配置为:
         * 波特率 = 115200
         * 数据位 = 8
         * 1位停止位
         * 无校验位
         * 使能接收和发送
         */
         
        USART_Init(USART1, (u32)9600, USART_WordLength_8b, USART_StopBits_1,
                                USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
        USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启接收中断
        USART_Cmd(USART1, ENABLE);        //使能UART2
}


main()
{
                CLK_HSICmd(ENABLE);
                CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
                while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET);
                  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

Uart1_Init();

while(1)
{
Delay_ms(20);
USART_SendData8(USART1, 0xfb);//在进入这个函数时经常提示 参数无效,而且数据寄存器中一直都是0x00,而且直接给该寄存器写值也写不进去
while(SART_GetFlagStatus( USART1, USART_FLAG_TC) == RESET);

}
       

}
代码就这么点,但就是没有数据,而且直接给USART1-DR赋值也没用,

收藏 1 评论10 发布时间:2016-12-1 15:29

举报

10个回答
zero99 回答时间:2016-12-1 17:30:43
顶一下
zcl201207 回答时间:2016-12-1 19:50:46
/* Includes ------------------------------------------------------------------*/
#include "stm8l15x.h"
#include "stdio.h"

/** @addtogroup STM8L15x_StdPeriph_Examples
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* define the GPIO port and pins connected to Leds mounted on STM8L152X-EVAL board */

#define LED_GPIO_PORT  GPIOB
#define LED_GPIO_PINS  GPIO_Pin_7

#define KEY_GPIO_PORT  GPIOD
#define KEY_GPIO_PINS  GPIO_Pin_2

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Delay (uint16_t nCount);

#ifdef _RAISONANCE_
#define PUTCHAR_PROTOTYPE int putchar (char c)
#define GETCHAR_PROTOTYPE int getchar (void)
#elif defined (_COSMIC_)
#define PUTCHAR_PROTOTYPE char putchar (char c)
#define GETCHAR_PROTOTYPE char getchar (void)
#else /* _IAR_ */
#define PUTCHAR_PROTOTYPE int putchar (int c)
#define GETCHAR_PROTOTYPE int getchar (void)
#endif /* _RAISONANCE_ */

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
void main(void)
{
  uint8_t ans;
  
  /* Config system clock as: HSI @ 16MHz  */
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  
  /* Initialize LEDs mounted on STM8L152X-EVAL board */
  GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_High_Fast);
  
   /* Initialize KEYs mounted on STM8L152X-EVAL board */
  GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_Mode_In_PU_No_IT);

  /* USART configured as follow:
        - BaudRate = 115200 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Receive and transmit enabled
        - USART Clock enabled
  */
  /* Enable USART clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
  
  /* USART configuration */
  USART_Init(USART1, (uint32_t)115200, USART_WordLength_8b, USART_StopBits_1,
                USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));

  /* Output a message on Hyperterminal using printf function */
  printf("\n\rUSART Example: retarget the C library printf() and getchar() functions to the USART\n\r");
  printf("\n\rEnter Text: \n\r");
  
  while (1)
  {
    ans = getchar();
    printf("%c", ans);
  }
}

/**
  * @brief  Inserts a delay time.
  * @param  nCount: specifies the delay time length.
  * @retval None
  */
void Delay(__IO uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}
/**
  * @brief Retargets the C library printf function to the USART.
  * @param[in] c Character to send
  * @retval char Character sent
  * @par Required preconditions:
  * - None
  */
PUTCHAR_PROTOTYPE
{
  /* Write a character to the USART */
  USART_SendData8(USART1, c);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

  return (c);
}
/**
  * @brief Retargets the C library scanf function to the USART.
  * @param[in] None
  * @retval char Character to Read
  * @par Required preconditions:
  * - None
  */
GETCHAR_PROTOTYPE
{
  int c = 0;
  /* Loop until the Read data register flag is SET */
  while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    c = USART_ReceiveData8(USART1);
    return (c);
  }

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* Infinite loop */
  while (1)
  {}
}
#endif


/******************************************************/

楼主拿去研究吧。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

HYP 回答时间:2016-12-1 21:36:17
zcl201207 发表于 2016-12-1 19:50
/* Includes ------------------------------------------------------------------*/
#include "stm8l15x. ...

          while (1)
  {
//   ans = getchar();
   while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
                                ans = USART_ReceiveData8(USART1);

    printf("%c", ans);
  }
改成你这样也不行,有没有其他的什么原因可以造成串口出现这样的问题
HYP 回答时间:2016-12-1 21:50:44
我现在怀疑不是程序的问题,是硬件的问题,谁有STM8L051F3的板子,能否帮忙试下我上面的程序,跪求了
小小超 回答时间:2016-12-2 09:17:32
端口配置不对?
HYP 回答时间:2016-12-2 11:02:19
ts2000 发表于 2016-12-2 09:17
端口配置不对?

void Uart1_Init(void)
{  USART_DeInit(USART1);                //复位UART1
          CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
        GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);//TXD
          GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);//RXD
           GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2, ENABLE);
                  GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_3, ENABLE);
        
        /*
         * 将UART1配置为:
         * 波特率 = 115200
         * 数据位 = 8
         * 1位停止位
         * 无校验位
         * 使能接收和发送
         */
         
        USART_Init(USART1, (u32)9600, USART_WordLength_8b, USART_StopBits_1,
                                USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
}


main()
{
                CLK_HSICmd(ENABLE);
                CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
                while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET);
                  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

Uart1_Init();

while(1)
{
Delay_ms(20);
USART_SendData8(USART1, 0xfb);//在进入这个函数时经常提示 参数无效,而且数据寄存器中一直都是0x00,而且直接给该寄存器写值也写不进去
while(SART_GetFlagStatus( USART1, USART_FLAG_TC) == RESET);

}

程序改成这样也还是不行,再查看外设寄存器CLK_PCKENR1->USART1也使能了,当就是没有数据发送,用示波器看该输出的引脚完全没有波形而是一直为高电平
HYP 回答时间:2016-12-2 16:12:19
原来是该串口和SPI复用IO口,要先配置好端口映射

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

流浪的猫猫 回答时间:2017-6-5 15:41:06
楼主   分享下 你的端口映射程序  用的PC5 PC6
ninicaoyuan 回答时间:2017-8-14 16:27:33
SYSCFG_REMAPDeInit();                                                            
   SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortC,ENABLE);    //复用PC5,PC6为串口
sssdd 回答时间:2017-8-18 15:23:41
本帖最后由 sssdd 于 2017-8-18 15:26 编辑

void Uart1_Init()
{
    UART1_DeInit();
    UART1_Init((u32)9600,
               UART1_WORDLENGTH_8D,
               UART1_STOPBITS_1,
               UART1_PARITY_NO,
               UART1_SYNCMODE_CLOCK_DISABLE,
               UART1_MODE_TXRX_ENABLE);//收发模式 波特率9600
    //UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);//串口接收中断
    UART1_Cmd(ENABLE);//串口打开
}
然后串口就开了。

    if((UART1->SR & 0x80)!=0)//TXE =1 发送缓冲空
    {//发送缓冲区空
        if(message_num)
        {
            message_num--;
            TXREG=Message_pool[message_num];
        }
        else
        {//消息队列结束
            if(Data_recived)
            {//消息: Got Data!
                Data_recived=0;
                message_num=10;
                Message_pool[9]='G';
                Message_pool[8]='o';
                Message_pool[7]='t';
                Message_pool[6]=' ';
                Message_pool[5]='D';
                Message_pool[4]='a';
                Message_pool[3]='t';
                Message_pool[2]='a';
                Message_pool[1]='!';
            
            }
            else if(OK_flag)
            {//消息: Trans Ok
                OK_flag=0;
                message_num=10;
                Message_pool[9]='T';
                Message_pool[8]='r';
                Message_pool[7]='a';
                Message_pool[6]='n';
                Message_pool[5]='s';
                Message_pool[4]=' ';
                Message_pool[3]='O';
                Message_pool[2]='K';
                Message_pool[1]='!';
            }
        }
    }
主程序添加↑这段,于是当message_num不为0,数据池有数据的时候就发出去了。。
补一个宏定义。
//------------------------
#define TXREG UART1->DR

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