STM32 之 UART1(2)

发布者:JoyfulSpirit最新更新时间:2016-10-06 来源: eefocus关键字:STM32  UART1 手机看文章 扫描二维码
随时随地手机看文章
(2)Init_External_Device.c
 
C语言: Codee#14663

#include "includes.h"

/*******************************************************************************
                             == 全局变量 == 
*******************************************************************************/

//=== UART1_RX变量,TX变量 ===========================================
unsigned char Uart1_Rx ;       // 接受一个字符变量
unsigned char Uart1_Tx ;       // 发送一个字符变量

//=== 精确延时 =======================================================
vu32 TimingDelay;              // 精确延时在SysTick中断里用的计数变量



/*******************************************************************************
* Function Name : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;

//将外设 RCC寄存器重设为缺省值
RCC_DeInit();

//设置外部高速晶振(HSE)
RCC_HSEConfig(RCC_HSE_ON);

//等待 HSE 起振 
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)
{
    //预取指缓存使能
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     //设置代码延时值
    //FLASH_Latency_2 2 延时周期
    FLASH_SetLatency(FLASH_Latency_2);

    //设置 AHB 时钟(HCLK)
    //RCC_SYSCLK_Div1 AHB 时钟 = 系统时钟 
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

     //设置高速 AHB 时钟(PCLK2)
    //RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 
    RCC_PCLK2Config(RCC_HCLK_Div2);

    //设置低速 AHB 时钟(PCLK1)
    //RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 
    RCC_PCLK1Config(RCC_HCLK_Div2);

    // PLLCLK = 8MHz * 9 = 72 MHz 
    //设置 PLL 时钟源及倍频系数
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    //使能或者失能 PLL
    RCC_PLLCmd(ENABLE);

    //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }


    //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    //等待PLL成功用作于系统时钟的时钟源
    // 0x00:HSI 作为系统时钟 
    // 0x04:HSE作为系统时钟 
    // 0x08:PLL作为系统时钟 
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
}

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);


//使能或者失能 APB2 外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
// Enable USART1 clocks 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


}

/*******************************************************************************
* Function Name : SysTick_Config   SysTick设置
* Description    : Configures SysTick
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SysTick_Config(void)
{
    /* Disable SysTick Counter */
    SysTick_CounterCmd(SysTick_Counter_Disable);

    /* Disable the SysTick Interrupt */
    SysTick_ITConfig(DISABLE);

    /* Configure HCLK clock as SysTick clock source */
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

    /* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */
    SysTick_SetReload(9000);

    /* Enable the SysTick Interrupt */
    SysTick_ITConfig(ENABLE);

}

/*******************************************************************************
* Function Name : NVIC_Configuration
* Description    : Configures NVIC and Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure1_UART1;

//===== Default ======================================================
#ifdef VECT_TAB_RAM
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
    
//===== NVIC_UART1 =================================================== 
    /* Configure the NVIC Preemption Priority Bits */ 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    /* Enable the USART1 Interrupt */
NVIC_InitStructure1_UART1.NVIC_IRQChannel = USART1_IRQChannel;   // 配置使能指定的IRQ(Interrupt ReQuest中断请求)通道
NVIC_InitStructure1_UART1.NVIC_IRQChannelPreemptionPriority = 0; // 配置IRQ的 组 优先级
NVIC_InitStructure1_UART1.NVIC_IRQChannelSubPriority = 0;        // 配置IRQ的 从 优先级
NVIC_InitStructure1_UART1.NVIC_IRQChannelCmd = ENABLE;           // 配置IRQ 使能
NVIC_Init(&NVIC_InitStructure1_UART1);                           // 初始化 UART1_IRQ
}

/*******************************************************************************
* Function Name : UART1_Configuration
* Description    : Configures the uart1 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void UART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure_UART1;
/* USART1 configured as follow:
        - BaudRate = 9600 baud 
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
*/
USART_InitStructure_UART1.USART_BaudRate = 9600;                                         // 配置UART1 波特率为9600   
USART_InitStructure_UART1.USART_WordLength = USART_WordLength_8b;                        // 配置UART1 传输过程中每一帧的数据位数为 8位
USART_InitStructure_UART1.USART_StopBits = USART_StopBits_1;                             // 配置UART1 发送停止位 为1个
USART_InitStructure_UART1.USART_Parity = USART_Parity_No ;                               // 配置UART1 奇偶效验模式 为无奇偶效验
USART_InitStructure_UART1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    // 配置UART1 硬件流控制 为无硬件流控制
USART_InitStructure_UART1.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                    // 配置UART1 使能发射和接受模式

/* Configure the USART1*/ 
USART_Init(USART1, &USART_InitStructure_UART1);          // 初始化UART1                                 

/* Enable USART1 Receive and Transmit interrupts */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);           // 配置UART1接受中断使能

/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);                               // 使能UART1
}

/*******************************************************************************
* Function Name : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure_LED_PORTB;
GPIO_InitTypeDef GPIO_InitStructure_KEY_PORTA;
GPIO_InitTypeDef GPIO_InitStructure_KEY_PORTB;
GPIO_InitTypeDef GPIO_InitStructure_KEY_PORTC;
GPIO_InitTypeDef GPIO_InitStructure_UART1_TX_PORTA;
GPIO_InitTypeDef GPIO_InitStructure_UART1_RX_PORTA;

//==== LED =======================================================
GPIO_InitStructure_LED_PORTB.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure_LED_PORTB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_LED_PORTB.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure_LED_PORTB); 

//==== KEY =======================================================
GPIO_InitStructure_KEY_PORTA.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure_KEY_PORTA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_KEY_PORTA.GPIO_Mode = GPIO_Mode_IPU ;     //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure_KEY_PORTA); 

GPIO_InitStructure_KEY_PORTB.GPIO_Pin = GPIO_Pin_7 ;
GPIO_InitStructure_KEY_PORTB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_KEY_PORTB.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure_KEY_PORTB); 

GPIO_InitStructure_KEY_PORTC.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure_KEY_PORTC.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_KEY_PORTC.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure_KEY_PORTC); 

//==== UART1 ======================================================
      // Configure USART1_Tx as alternate function push-pull 
GPIO_InitStructure_UART1_TX_PORTA.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure_UART1_TX_PORTA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_UART1_TX_PORTA.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure_UART1_TX_PORTA); 

      // Configure USART1_Rx as input floating 
GPIO_InitStructure_UART1_RX_PORTA.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure_UART1_RX_PORTA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_UART1_RX_PORTA.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 悬浮输入
GPIO_Init(GPIOA, &GPIO_InitStructure_UART1_RX_PORTA); 

}

/*******************************************************************************
* Function Name : 精确延时函数
*******************************************************************************/
void Delay_Ms(u32 nTime)
{
/* Enable the SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Enable);

TimingDelay = nTime;

while(TimingDelay != 0);

/* Disable SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* Clear SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Clear);
}


关键字:STM32  UART1 引用地址:STM32 之 UART1(2)

上一篇:STM32 之 ADC_DMA
下一篇:STM32 之 UART1(1)

推荐阅读最新更新时间:2024-03-16 15:13

STM32如何通过FSMC点亮LCD
FSMC是Flexible static memory controller(可变静态存储控制器)的简称,是STM32系列采用的一种新型的存储器扩展技术,支持SRAM、Nor Flash、LCD、PSRAM、NAND Flash、PC Card等。只在某些芯片上有,使用前要查看对应的手册确定。 在FSMC的角度来看,外部存储分成了4个固定的大小为256MB的bank。 Bank1分成了4个子bank,每一个64MB大小,并且每个bank都有独立的片选,用来控制Nor Flash、RAM、PSRAM。Bank2和Bank3用来控制NAND Flash。Bank4控制PC Card。 不同的Bank共享了地址、数据、读、写
[单片机]
<font color='red'>STM32</font>如何通过FSMC点亮LCD
stm32使用SDIO方式+FATFS读写内存卡
针对stm32f103zet 单片机完成对内存卡的读写操作,可以查看内存卡目录,写入文件,删除文件,更改文件,清空文件内容等,使得stm32f103zet单片机能有一个较大的外部存储空间,可跑文件系统。 内存卡分为有普通卡和高速卡SDHC卡之分 普通内存卡一般大小在2g以下 SD高速卡一般在8g~16g STM32F103ZE-EK开发板原理图 :https://pan.baidu.com/s/1smpn8VN 普通内存卡老式内存卡程序 稳定版本程序代码 :https://pan.baidu.com/s/1mjO9CDU 高速内存卡HCsdcard程序 某些程序待完善程序代码 :https://pan.baidu.co
[单片机]
STM32库函数详解----(外部中断/事件控制器 EXTI)
1.void EXTI_DeInit (void) 函数解释:将EXTI外设寄存器重置为默注释。RCC_APB2PeriphResetCmd参数中没有EXTI外设的的宏,该外设重置采取的是直接向寄存器赋默认值的操作。 例子:EXTI_DeInit ( ); 2.void EXTI_Init (EXTI_InitTypeDef*EXTI_InitStruct) 函数解释:根据EXTI_InitStruct结构体中所配置的参数来初始化外设EXTI寄存器。结构体中模式成员设置了被使能线路是事件请求还是中断请求。 例子:EXTI_Init (&EXTI_InitStruct); EXTI_Line: EXTI_
[单片机]
STM32 SPI配置
用stm32的库进行深入 SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 四根线 MISO 主设备数据输入,从设备数据输出。 MOSI 主设备数据输出,从设备数据输入。 SCLK时钟信号,由主设备产生。 CS从设备片选信号,由主设备控制。 外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节 时钟极性CPOL对传输协议没有重大的影响,代表串行同步时钟的空闲状态下的电平。 时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串
[单片机]
<font color='red'>STM32</font> SPI配置
STM32芯片内部架构的详细介绍
STM32芯片主要由内核和片上外设组成,STM32F103采用的是Cortex-M3内核,内核由ARM公司设计。STM32的芯片生产厂商ST,负责在内核之外设计部件并生产整个芯片。这些内核之外的部件被称为核外外设或片上外设,如 GPIO、USART(串口)、I2C、SPI 等。 芯片内部架构示意图 芯片内核与外设之间通过各种总线连接,其中驱动单元有 4 个,被动单元也有 4 个,具体如上图所示。可以把驱动单元理解成是内核部分,被动单元都理解成外设。 ICode 总线 ICode总线是专门用来取指令的,其中的I表示Instruction(指令),指令的意思。写好的程序编译之后都是一条条指令,存放在 FLASH中,内核通过IC
[单片机]
<font color='red'>STM32</font>芯片内部架构的详细介绍
STM32的USART窗口通讯程序
一、准备工作 硬件原理图: 所用器件:核心版、下载线ST–Link、usb转TTL线 所用编程软件:MDK5.33 二、操作目的 设置波特率为115200,1位停止位,无校验位。 STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。 当上位机给stm32发送“Stop,stm32”后,stm32停止发送。 三、实验操作 1.实验所需代码 #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include stdl
[单片机]
<font color='red'>STM32</font>的USART窗口通讯程序
STM32的位带操作重谈嵌入式中寻址与对齐的理解
觉得这篇文章很不错,普及知识: 初接触STM32的人一定花了不少时间用于理解其位带操作(bit banding)的原理与步骤。位带操作允许编程人员以字的单位读/写单一bit位。回想我们平时对于一个bit位的操作比如: @- PIN0 |= (1 3); @- PIN0 &= ~(1 5); 虽然这只是一行代码,但是实际上这一行做了好几步的工作。比如第一行,首先读出当前PIN0的值放到缓存区,将1左移三位放入缓存区,将二者进行 或 操作,即将当前PIN0的第三位置位1,将结果存入到实际PIN0所在的地址,即更新了PIN0的值。当然实际写成汇编后可能步骤不见得一定一样,但是这几步工作是一定得做的。 而对于位带操作,S
[单片机]
从<font color='red'>STM32</font>的位带操作重谈嵌入式中寻址与对齐的理解
STM32学习笔记之电容触摸1
电容触摸简介 8.1.1 电容触摸概述 随着科技的发展,传统的机械按键正在逐步从设备上面消失,这个原因主要有机械按键由于是采用机械接触的方式,寿命比较短,从用户体验上看,机械按键也显得操作复杂,对比现在的电容按键,电容按键具有寿命长,因为不存在机械接触,占用空间少,以前的机械按键在设计外壳的时候需要考虑尺寸,现在换成电容按键后这个问题不再需要考虑。 8.1.2 检测原理 常规的检测方式一般是通过计算电容放电时间来判断是否有手指按下,这是因为手指会与线路板的铜箔接触面上产生电容效应,当手指没有放在铜箔上的时候,铜箔与PCB之间存在杂散电容,这两个状态的电容值差别很大,检测原理如下图所示。 在检测之前首先用开关将电容Cs里面的电荷
[单片机]
<font color='red'>STM32</font>学习笔记之电容触摸1
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved