打印
[STM8]

请大家帮忙看看STM8L151C8串口程序

[复制链接]
4464|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elitecmt|  楼主 | 2015-8-8 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,帮忙看看下面程序,LED指示灯能正常工作,采用TTL转USB连接到PC机上,串口助手显示发送的数据一直为“00”;不管怎么更改都是这样的?
新手上路,请大家支招,谢谢!


#include "stm8l15x.h"
#include "stdio.h"
unsigned char i;
int temp;
char t;
void Uart2_Int(void);
void Uart3_Int(void);
void delay(unsigned int time);
void putch2(unsigned char c);
void putch3(unsigned char c);

int main( void )
{
  GPIOD->ODR=0xff;
  GPIOD->DDR=0XFF;
  GPIOD->CR1=0XFF;
  GPIOD->CR2=0X00;

  CLK->ECKCR = 0X21;
  while(0x02 != (CLK->ECKCR & 0x02))
  {   
  }  
    CLK->SWCR = CLK_SWCR_SWEN;
    CLK->SWR = 0x04;
    CLK->CKDIVR = 0x04;
    while(0x04 != (CLK->SCSR));
    CLK->SWCR=0;  

    CLK->PCKENR3 = 0X18;


    Uart2_Int();
    Uart3_Int();
   while(1)
  {


   GPIOD->ODR=0x0f;
   putch2(1);
   putch3(2);
   delay(50000);
   GPIOD->ODR=0xff;
   delay(50000);

  }
}

void Uart2_Int(void)
  {
    USART2->CR1=0x00;
    USART2->CR2=0x08;
    USART2->CR3=0X00;
    USART2->BRR2=0X00;
    USART2->BRR1=0X0D;

  }
void Uart3_Int(void)
  {
    USART3->CR1=0x00;
    USART3->CR2=0x08;
    USART3->CR3=0X00;
    USART3->BRR2=0X00;
    USART3->BRR1=0X48;   
  }
void putch2(unsigned char ch)
{
   while((USART2->SR&0x40)==0);
   USART2->DR=ch;
   //return c;
}
void putch3(unsigned char ch)
{

   while((USART3->SR&0x80)==0);
   USART3->DR=ch;
   //return c;
}
void delay(unsigned int t)
{
  while(t--);
}



沙发
可可球| | 2015-8-8 17:52 | 只看该作者
串口初始化及波特率设置怎么样

使用特权

评论回复
板凳
songchenping| | 2015-8-8 18:27 | 只看该作者
这怎么看。你既然要用寄存器模式,就应该讲寄存器中的位的名字带上。

使用特权

评论回复
地板
songchenping| | 2015-8-8 18:27 | 只看该作者
这样做即比较直观一点了。

使用特权

评论回复
5
songchenping| | 2015-8-8 18:29 | 只看该作者

类似这种模式啊

void MX_USART2_Config(void)
{

  /* Enable the peripheral clock USART2 */
  RCC->APB1ENR |= RCC_APB1ENR_USART2EN;

  /* Configure USART2 */
  /* oversampling by 16, 115200 baud */
  USART2->BRR = 160000/1152;

  /* Synchronous mode */
  /* In asynchronous mode, the following bits must be kept cleared.*/
  /* LINEN and CLKEN bits in the USART_CR2 register. */
  /* SCEN, HDSEL and IREN  bits in the USART_CR3 register.*/  
  USART2->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
  USART2->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);

  /* 8 data bit, 1 start bit, 1 stop bit, no parity */
  USART2->CR1 &= ~(USART_CR1_M);
  USART2->CR2 &= ~(USART_CR2_STOP);

  /* Transmission enabled, reception enabled */  
  USART2->CR1 |= USART_CR1_RE | USART_CR1_TE;  

  /* enable RXNEIE interrupt */
//  USART2->CR1 |= USART_CR1_RXNEIE;

  /* Enable usart2 */
  USART2->CR1 |= USART_CR1_UE;  

  /* Configure IT */
  /* Set priority for USART2_IRQn */
//  NVIC_SetPriority(USART2_IRQn, 1);

  /* Enable USART2_IRQn */  
//  NVIC_EnableIRQ(USART2_IRQn);

}

使用特权

评论回复
6
米尔豪斯| | 2015-8-8 21:11 | 只看该作者
没有注释,没有原理图,表示看着吃力

使用特权

评论回复
7
elitecmt|  楼主 | 2015-8-9 09:56 | 只看该作者
找到问题,需要单独把IO口配置成输入上拉就好了。感觉STM8L151与STM8S系列的设置有差异

使用特权

评论回复
8
Thor9| | 2015-8-9 10:26 | 只看该作者
单独把IO口配置成输入上拉就好了,为什么要这样设置呢

使用特权

评论回复
9
elitecmt|  楼主 | 2015-8-9 10:34 | 只看该作者
管脚复用,需要手动设置一下;没有设置时,通讯一直都不正常。
@Thor9,我是参考151的内部接口图才搞定的

使用特权

评论回复
10
songchenping| | 2015-8-9 11:55 | 只看该作者
管脚复用的话肯定要单独配置啊。

使用特权

评论回复
11
elitecmt|  楼主 | 2015-8-9 13:08 | 只看该作者
但在STM8S系列单片机提供的案例里面,没有看到这块的东东,或许个人理解有误。

使用特权

评论回复
12
zhanganlin| | 2016-6-2 16:19 | 只看该作者
“需要单独把IO口配置成输入上拉就好了”
这句不是很理解,能贴上代码吗,tks!

使用特权

评论回复
13
restlin| | 2016-11-5 16:54 | 只看该作者
本帖最后由 restlin 于 2016-11-5 22:34 编辑
zhanganlin 发表于 2016-6-2 16:19
“需要单独把IO口配置成输入上拉就好了”
这句不是很理解,能贴上代码吗,tks! ...

注:这是 STM8L152C6 的例程。

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
    USART_DeInit(USART1);       //复位UART1
    /*
     * 将UART1配置为:
     * 波特率 = 115200
     * 数据位 = 8
     * 1位停止位
     * 无校验位
     * 使能接收和发送
     */
    USART_Init(USART1, (u32)115200, 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);  //使能UART1
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

15

帖子

0

粉丝