新手入门 
 
	- 积分
 - 3
 
        - 金钱
 - 3 
 
       - 注册时间
 - 2020-5-31
 
      - 在线时间
 - 0 小时
 
 
 
 | 
 
2金钱 
串口1初始化使用的是正点原子F4的代码 
OLED使用的是网上找的代码 
两者均能单独工作,但是同时使用时OLED无法正常使用 
串口1初始化代码: 
- /****************************************************************************************************
 
 - //=========================================电源接线================================================//
 
 - // USB转TTL模块           STM32单片机
 
 - //     VCC         接          3.3V         //电源正
 
 - //     GND         接          GND          //电源地
 
 - //=======================================数据线接线==========================================//
 
 - // USB转TTL模块           STM32单片机
 
 - //     RxD         接          PA9         //USB转TTL的接收端连接单片机的发送端
 
 - //     TxD         接          PA10        //USB转TTL的发送端连接单片机的接收端
 
 - //=======================================STM32单片机内部usart1引脚============================//
 
 - //  USART1_Tx               PA9          需复用
 
 - //  USART1_Rx               PA10         需复用
 
 - //  USART1_CK               PA8        
 
 - //  USART1_CTS              PA11 
 
 - //  USART1_RTS              PA12
 
 - ****************************************************************************************************/        
 
  
- #include "stm32f4xx.h"
 
 - #include "usart.h"
 
 - #include "delay.h"
 
 - #include "sys.h"
 
 - #include "stdio.h"
 
  
- //如果使用ucos,则包括下面的头文件即可.
 
 - #if SYSTEM_SUPPORT_OS
 
 - #include "includes.h"                                        //ucos 使用          
 
 - #endif
 
 - //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
 
 - #if 1
 
 - #pragma import(__use_no_semihosting)             
 
 - //标准库需要的支持函数                 
 
 - struct __FILE 
 
 - { 
 
 -         int handle; 
 
 - }; 
 
 - FILE __stdout;       
 
 - //定义_sys_exit()以避免使用半主机模式    
 
 - _sys_exit(int x) 
 
 - { 
 
 -         x = x; 
 
 - } 
 
 - //__use_no_semihosting was requested, but _ttywrch was 
 
 - _ttywrch(int ch)
 
 - {
 
 -     ch = ch;
 
 - }
 
 - //重定义fputc函数 
 
 - int fputc(int ch, FILE *f)
 
 - {         
 
 -         while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
 
 -         USART1->DR = (u8) ch;      
 
 -         return ch;
 
 - }
 
 - #endif
 
  
- #if EN_USART1_RX   //如果使能了接收
 
 - //串口1中断服务程序
 
 - //注意,读取USARTx->SR能避免莫名其妙的错误           
 
 - u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
 
 - //接收状态
 
 - //bit15,        接收完成标志
 
 - //bit14,        接收到0x0d
 
 - //bit13~0,        接收到的有效字节数目
 
 - u16 USART_RX_STA=0;       //接收状态标记        
 
 - /********************************************************
 
 - 函数名称:Usart1Init
 
 - 函数功能:初始化串口1
 
 - 入口参数:无
 
 - 备    注:无
 
 - 返回参数:无
 
 - 作    者:
 
 - ***********************************************************/
 
 - void Usart1_Init(void)
 
 - {
 
 -         //定义三个结构体
 
 -         GPIO_InitTypeDef gpioinit ;
 
 -         USART_InitTypeDef initusart;
 
 -         NVIC_InitTypeDef nvicinit;
 
  
-         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //使能串口一的时钟
 
 -         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);   //使能引脚的时钟
 
  
-         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIO引脚复用配置映射PA9映射到串口
 
 -         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIO引脚复用配置映射PA10映射到串口
 
  
-         //USART1的PA9、PA10端口配置
 
 -         gpioinit.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;    // 引脚9 
 
 -         gpioinit.GPIO_Mode = GPIO_Mode_AF;  // 模式位复用模式
 
 -         gpioinit.GPIO_OType = GPIO_OType_PP ;// 输出类型是推免输出 初始状态
 
 -         gpioinit.GPIO_PuPd = GPIO_PuPd_UP; //上拉
 
 -         gpioinit.GPIO_Speed = GPIO_Speed_100MHz ; // 速度
 
 -         GPIO_Init(GPIOA,&gpioinit);
 
  
-   //USART1 初始化设置
 
 -         initusart.USART_BaudRate=Bound_1;//波特率
 
 -         initusart.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流  TEC CTC 什么一些鬼东西哦
 
 -         initusart.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;     //模式,使能发送或者接受
 
 -         initusart.USART_Parity = USART_Parity_No;             //奇偶校验位
 
 -         initusart.USART_StopBits = USART_StopBits_1 ;         //停止位
 
 -         initusart.USART_WordLength = USART_WordLength_8b;     //字长为 8 位数据格式
 
 -         USART_Init(USART1,&initusart);   //进行串口的初始化
 
  
-         USART_Cmd(USART1,ENABLE);   //串口使能函数
 
 - #if EN_USART1_RX        
 
  
-         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口接收完成中断
 
 -         //USART_ITConfig(USART1,USART_IT_TC,ENABLE);//使能串口发送完成中断
 
  
-   // 初始化中断,USART1 NVIC配置
 
 -         nvicinit.NVIC_IRQChannel=USART1_IRQn;//串口1中断通道
 
 -         nvicinit.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
 
 -         nvicinit.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级设置
 
 -         nvicinit.NVIC_IRQChannelSubPriority=3;//响应优先级设置
 
 -         NVIC_Init(&nvicinit);
 
 -         
 
 - #endif
 
 -         //printf("\r\n串口1初始化完成\r\n");
 
 - }
 
  
- /********************************************************
 
 - 函数名称:USART1_IRQHandler
 
 - 函数功能:串口1中断服务函数,进行数据的回传
 
 - 入口参数:无
 
 - 备    注:无
 
 - 返回参数:无
 
 - 作    者:
 
 - ***********************************************************/
 
 - //中断服务函数
 
 - void USART1_IRQHandler(void)
 
 - {
 
 -         u8 Res;
 
 - #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
 
 -         OSIntEnter();    
 
 - #endif
 
 -         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
 
 -         {
 
 -                 Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
 
 -                 
 
 -                 if((USART_RX_STA&0x8000)==0)//接收未完成
 
 -                 {
 
 -                         if(USART_RX_STA&0x4000)//接收到了0x0d
 
 -                         {
 
 -                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
 
 -                                 else USART_RX_STA|=0x8000;        //接收完成了 
 
 -                         }
 
 -                         else //还没收到0X0D
 
 -                         {        
 
 -                                 if(Res==0x0d)USART_RX_STA|=0x4000;
 
 -                                 else
 
 -                                 {
 
 -                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
 
 -                                         USART_RX_STA++;
 
 -                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
 
 -                                 }                 
 
 -                         }
 
 -                 }                    
 
 -   } 
 
 - #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
 
 -         OSIntExit();                                                                                           
 
 - #endif
 
 - }
 
  
- int Usart1_Receivedata_1(void)
 
 - {
 
 -         u8 t,len; u16 times=0;
 
 -         while(1)
 
 -         {
 
 -                 if(USART_RX_STA&0x8000)
 
 -                 { 
 
 -                         printf("\r\n 成功接收到您发送的信息!\r\n");
 
 -                         len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
 
 -                         printf("\r\n 您发送的消息为:\r\n");
 
 -                         printf("\r\n\r\n");//插入换行
 
 -                         for(t=0;t<len;t++)
 
 -                         {
 
 -                                 USART1->DR=USART_RX_BUF[t];
 
 -                                 while((USART1->SR&0X40)==0);//等待发送结束
 
 -                                 //USART_SendData(USART1, USART_RX_BUF[t]); //向串口 1 发送数据
 
 -                                 //while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完成
 
 -                         }
 
 -                         printf("\r\n\r\n");//插入换行
 
 -                         USART_RX_STA=0;
 
 -                         return 0;
 
 -                 }
 
 -                 else
 
 -                 {
 
 -                         times++;
 
 -                         if(times%200==0)printf("请输入数据,以回车键结束\r\n"); 
 
 -                         //if(times%30==0)LED0=!LED0;//闪烁 LED,提示系统正在运行.
 
 -                         delay_ms(10);
 
 -                 }
 
 -         }
 
 - }<div class="blockcode"><blockquote>void OLED_Init(void)
 
 - {
 
 -         SPI1_Init();  //初始化SPI2
 
 -          OLED_Init_GPIO(); //初始化GPIO
 
 -          delay_ms(200);
 
 -         OLED_Reset();     //复位OLED
 
  
- /**************初始化SSD1306*****************/        
 
 -         OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/
 
 -         OLED_WR_Byte(0x00,OLED_CMD); /*set lower column address*/
 
 -         OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/
 
 -         OLED_WR_Byte(0x40,OLED_CMD); /*set display start line*/ 
 
 -         OLED_WR_Byte(0xB0,OLED_CMD); /*set page address*/
 
 -         OLED_WR_Byte(0x81,OLED_CMD); /*contract control*/ 
 
 -         OLED_WR_Byte(0xFF,OLED_CMD); /*128*/
 
 -         OLED_WR_Byte(0xA1,OLED_CMD); /*set segment remap*/ 
 
 -         OLED_WR_Byte(0xA6,OLED_CMD); /*normal / reverse*/
 
 -         OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/ 
 
 -         OLED_WR_Byte(0x3F,OLED_CMD); /*duty = 1/64*/
 
 -         OLED_WR_Byte(0xC8,OLED_CMD); /*Com scan direction*/
 
 -         OLED_WR_Byte(0xD3,OLED_CMD); /*set display offset*/ 
 
 -         OLED_WR_Byte(0x00,OLED_CMD);
 
 -         OLED_WR_Byte(0xD5,OLED_CMD); /*set osc division*/ 
 
 -         OLED_WR_Byte(0x80,OLED_CMD);
 
 -         OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/ 
 
 -         OLED_WR_Byte(0XF1,OLED_CMD);
 
 -         OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/ 
 
 -         OLED_WR_Byte(0x12,OLED_CMD);
 
 -         OLED_WR_Byte(0xDB,OLED_CMD); /*set vcomh*/ 
 
 -         OLED_WR_Byte(0x30,OLED_CMD);
 
 -         OLED_WR_Byte(0x8D,OLED_CMD); /*set charge pump disable*/ 
 
 -         OLED_WR_Byte(0x14,OLED_CMD);
 
 -         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
 
 - }  
 
 - void SPI1_Init(void)        
 
 - {
 
 -         GPIO_InitTypeDef  GPIO_InitStructure;
 
 -   SPI_InitTypeDef  SPI_InitStructure;
 
 -         
 
 -   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
 
 -   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟
 
 -  
 
 -   //GPIOFB3,4,5初始化设置
 
 -   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5复用功能输出        
 
 -   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
 
 -   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
 
 -   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
 
 -   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 
 -   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
 
 -         
 
 -         GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1
 
 -         GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4复用为 SPI1
 
 -         GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5复用为 SPI1
 
 -  
 
 -         //这里只针对SPI口初始化
 
 -         RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
 
 -         RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1
 
  
-         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
 
 -         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
 
 -         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
 
 -         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
 
 -         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
 
 -         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
 
 -         //SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;                //定义波特率预分频的值:波特率预分频值为256
 
 -         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
 
 -         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
 
 -         SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
 -  
 
 -         SPI_Cmd(SPI1, ENABLE); //使能SPI外设        
 
 - }
 
 - void OLED_Init_GPIO(void)
 
 - {
 
 -         GPIO_InitTypeDef  GPIO_InitStructure;
 
 -               
 
 -         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB ,ENABLE);
 
 -         
 
 -         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12|GPIO_Pin_14| GPIO_Pin_15; //GPIOB12,14,15
 
 -         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
 
 -         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
 
 -         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //推挽输出
 
 -         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 
 -         GPIO_Init(GPIOB, &GPIO_InitStructure);        //初始化GPIOB12,14,15
 
 - }
 
 
  复制代码 
 
 
#endif 
 
 
 
 
 
 |   
 
 
 
 
 
 |