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赋值也没用,
顶一下 /* 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
/******************************************************/
楼主拿去研究吧。 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);
}
改成你这样也不行,有没有其他的什么原因可以造成串口出现这样的问题 我现在怀疑不是程序的问题,是硬件的问题,谁有STM8L051F3的板子,能否帮忙试下我上面的程序,跪求了 端口配置不对? 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也使能了,当就是没有数据发送,用示波器看该输出的引脚完全没有波形而是一直为高电平
原来是该串口和SPI复用IO口,要先配置好端口映射 楼主 分享下 你的端口映射程序用的PC5 PC6
SYSCFG_REMAPDeInit();
SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortC,ENABLE); //复用PC5,PC6为串口
页:
[1]
2