HYP 发表于 2016-12-1 15:29:13

STM8L051F3串口调试不通

最近刚刚接触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赋值也没用,

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_PORTGPIOB
#define LED_GPIO_PINSGPIO_Pin_7

#define KEY_GPIO_PORTGPIOD
#define KEY_GPIO_PINSGPIO_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 ---------------------------------------------------------*/

/**
* @briefMain program.
* @paramNone
* @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);
}
}

/**
* @briefInserts a delay time.
* @paramnCount: 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 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 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);
}

#ifdefUSE_FULL_ASSERT

/**
* @briefReports the name of the source file and the source line number
*   where the assert_param error has occurred.
* @paramfile: pointer to the source file name
* @paramline: 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


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

楼主拿去研究吧。

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的板子,能否帮忙试下我上面的程序,跪求了

ts2000 发表于 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口,要先配置好端口映射

流浪的猫猫 发表于 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为串口
页: [1] 2
查看完整版本: STM8L051F3串口调试不通