打印
[STM32L1]

STM32L151芯片的串口初始化

[复制链接]
10083|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
allenchenhh|  楼主 | 2014-7-8 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想要实现的功能是STM32通过串口发送数据到PC,参考F系列和网上的资料写的初始化,但运行不起来,应该是某个地方没有设置正确,希望有该经验的同仁指点一二,谢谢。
       
void USART1_INIT(void)
{

  USART_InitTypeDef USART_InitStructure;
       
  GPIO_InitTypeDef GPIO_InitStructure;
       

  /* Enable GPIO clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

  /* Enable USART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //PA9-TX  PA10-RX

  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* Connect PXx to USARTx_Tx */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_USART1);//PA9-TX

  /* Connect PXx to USARTx_Rx */
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10-RX

  /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART Rx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStructure);

  /* USART configuration */
  USART_Init(USART1,&USART_InitStructure);

               
  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
       
}

沙发
jusun66| | 2014-7-8 11:28 | 只看该作者
没看出来问题,请问PA9和PA10有没有悬空,加示波器观测一下?

使用特权

评论回复
板凳
allenchenhh|  楼主 | 2014-7-8 11:32 | 只看该作者
jusun66 发表于 2014-7-8 11:28
没看出来问题,请问PA9和PA10有没有悬空,加示波器观测一下?

悬空了,现在的问题是我单步调试运行到了USART_SendData(USART1,TxBuf1);函数里面对DA寄存器赋值,写不进去,里面这一句 USARTx->DR = (Data & (uint16_t)0x01FF);我明明看到Data是有值的,然后运行了这一句,DA寄存器还是全0,不知道是怎么回事?

使用特权

评论回复
地板
jusun66| | 2014-7-8 12:00 | 只看该作者
你的固件库用的是不是STM32L1xx的固件库,先拿STM32L1xx固件库中的USART例程先跑看看

使用特权

评论回复
5
allenchenhh|  楼主 | 2014-7-8 12:03 | 只看该作者
jusun66 发表于 2014-7-8 12:00
你的固件库用的是不是STM32L1xx的固件库,先拿STM32L1xx固件库中的USART例程先跑看看 ...

是的 但是他用的是stm的开发板,跟我的硬件不一样。

使用特权

评论回复
6
mmuuss586| | 2014-7-8 13:08 | 只看该作者
本帖最后由 mmuuss586 于 2014-7-8 13:11 编辑
allenchenhh 发表于 2014-7-8 12:03
是的 但是他用的是stm的开发板,跟我的硬件不一样。


:)
你的初始化程序没啥问题,最多就是没有中断初始化,你中断没使用的话也可以不写;

最好在官方的例程上改改;
你找个其它系列的程序改有问题也很正常;

使用特权

评论回复
7
allenchenhh|  楼主 | 2014-7-8 14:47 | 只看该作者
mmuuss586 发表于 2014-7-8 13:08
你的初始化程序没啥问题,最多就是没有中断初始化,你中断没使用的话也可以不写;

最好在官方的例程 ...

这是完整的代码,采用中断方式,发送的话,中断那里不需要什么处理吧,还是不行。
#include "stm32l1xx.h"
//#include "stm32_eval.h"
#include <stdio.h>


void USART1_INIT(void)
{

  USART_InitTypeDef USART_InitStructure;
       
  GPIO_InitTypeDef GPIO_InitStructure;
       

  /* Enable GPIO clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

  /* Enable USART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //PA9-TX  PA10-RX

  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* Connect PXx to USARTx_Tx */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_USART1);//PA9-TX

  /* Connect PXx to USARTx_Rx */
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10-RX

  /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART Rx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  /* USART configuration */
  USART_Init(USART1,&USART_InitStructure);

               
  /* Enable USART */

  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_Cmd(USART1, ENABLE);
}



void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{
  
   int i;
   unsigned char TxBuf1[] = "Welcome to my STM32! Please press any key!";   
       
   NVIC_Config();
   USART1_INIT();

               
         for( i=0;TxBuf1!='\0';i++)
         {
                        USART_SendData(USART1,TxBuf1);
                       
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
               
                }


  while (1)
  {

  }
}

使用特权

评论回复
8
mmuuss586| | 2014-7-8 16:17 | 只看该作者
STM32L1xx标准外设库.zip (18.6 MB)

使用特权

评论回复
评论
者结终 2018-8-30 19:43 回复TA
能再发下吗?这个问价是损坏的 
9
遇从灵来| | 2014-7-11 15:49 | 只看该作者
十有**是时钟设置错误,我也遇到过类似的问题,

使用特权

评论回复
10
allenchenhh|  楼主 | 2014-7-14 15:22 | 只看该作者
遇从灵来 发表于 2014-7-11 15:49
十有**是时钟设置错误,我也遇到过类似的问题,

正解啊,确实是这样,把8M时钟改成板子上面的24M就可以啦。

使用特权

评论回复
11
yuanzuo| | 2014-12-1 11:05 | 只看该作者
学习一下!!!

使用特权

评论回复
12
新晴野望| | 2014-12-25 15:11 | 只看该作者
allenchenhh 发表于 2014-7-14 15:22
正解啊,确实是这样,把8M时钟改成板子上面的24M就可以啦。

那请问应该如何修改时钟设置呢,初学者,希望多多指教

使用特权

评论回复
13
elecintop| | 2014-12-28 19:40 | 只看该作者
拿STM32L1xx固件库中的USART例程先跑看看

使用特权

评论回复
14
白丁野老| | 2014-12-30 21:19 | 只看该作者
:)

使用特权

评论回复
15
小杜锅锅| | 2015-7-21 18:22 | 只看该作者
楼主,我最近也在学STM32L152VBT6单片机,网上资源太少,能否加个QQ方便以后交流? 641810479

使用特权

评论回复
16
1316014468| | 2016-3-1 21:00 | 只看该作者
初始化配置没什么问题,看下时钟配置。

使用特权

评论回复
17
雪臣子| | 2016-3-24 10:05 | 只看该作者
学习了

使用特权

评论回复
18
李卫东| | 2016-4-8 16:46 | 只看该作者
我是电子狗用的数据,那我这样写数据了

使用特权

评论回复
19
hugo0chen| | 2017-2-15 19:30 | 只看该作者
我也遇到这个问题,USARTx->DR数据寄存器写不进去。

使用特权

评论回复
20
hugo0chen| | 2017-2-15 19:32 | 只看该作者
allenchenhh 发表于 2014-7-8 11:32
悬空了,现在的问题是我单步调试运行到了USART_SendData(USART1,TxBuf1);函数里面对DA寄存器赋值,写不进 ...

这个最后处理方式是把板子上的8M晶振改为24MHz的晶振?

使用特权

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

本版积分规则

10

主题

44

帖子

1

粉丝