OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4175|回复: 1

STM32F4使用了串口1后OLED无法显示,不使用串口1就能正常使用

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-5-31
在线时间
0 小时
发表于 2022-4-15 18:28:09 | 显示全部楼层 |阅读模式
2金钱
串口1初始化使用的是正点原子F4的代码
OLED使用的是网上找的代码
两者均能单独工作,但是同时使用时OLED无法正常使用
串口1初始化代码:
  1. /****************************************************************************************************
  2. //=========================================电源接线================================================//
  3. // USB转TTL模块           STM32单片机
  4. //     VCC         接          3.3V         //电源正
  5. //     GND         接          GND          //电源地
  6. //=======================================数据线接线==========================================//
  7. // USB转TTL模块           STM32单片机
  8. //     RxD         接          PA9         //USB转TTL的接收端连接单片机的发送端
  9. //     TxD         接          PA10        //USB转TTL的发送端连接单片机的接收端
  10. //=======================================STM32单片机内部usart1引脚============================//
  11. //  USART1_Tx               PA9          需复用
  12. //  USART1_Rx               PA10         需复用
  13. //  USART1_CK               PA8        
  14. //  USART1_CTS              PA11
  15. //  USART1_RTS              PA12
  16. ****************************************************************************************************/       

  17. #include "stm32f4xx.h"
  18. #include "usart.h"
  19. #include "delay.h"
  20. #include "sys.h"
  21. #include "stdio.h"

  22. //如果使用ucos,则包括下面的头文件即可.
  23. #if SYSTEM_SUPPORT_OS
  24. #include "includes.h"                                        //ucos 使用          
  25. #endif
  26. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  27. #if 1
  28. #pragma import(__use_no_semihosting)            
  29. //标准库需要的支持函数                 
  30. struct __FILE
  31. {
  32.         int handle;
  33. };
  34. FILE __stdout;      
  35. //定义_sys_exit()以避免使用半主机模式   
  36. _sys_exit(int x)
  37. {
  38.         x = x;
  39. }
  40. //__use_no_semihosting was requested, but _ttywrch was
  41. _ttywrch(int ch)
  42. {
  43.     ch = ch;
  44. }
  45. //重定义fputc函数
  46. int fputc(int ch, FILE *f)
  47. {        
  48.         while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
  49.         USART1->DR = (u8) ch;      
  50.         return ch;
  51. }
  52. #endif

  53. #if EN_USART1_RX   //如果使能了接收
  54. //串口1中断服务程序
  55. //注意,读取USARTx->SR能避免莫名其妙的错误          
  56. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  57. //接收状态
  58. //bit15,        接收完成标志
  59. //bit14,        接收到0x0d
  60. //bit13~0,        接收到的有效字节数目
  61. u16 USART_RX_STA=0;       //接收状态标记       
  62. /********************************************************
  63. 函数名称:Usart1Init
  64. 函数功能:初始化串口1
  65. 入口参数:无
  66. 备    注:无
  67. 返回参数:无
  68. 作    者:
  69. ***********************************************************/
  70. void Usart1_Init(void)
  71. {
  72.         //定义三个结构体
  73.         GPIO_InitTypeDef gpioinit ;
  74.         USART_InitTypeDef initusart;
  75.         NVIC_InitTypeDef nvicinit;

  76.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //使能串口一的时钟
  77.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);   //使能引脚的时钟

  78.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIO引脚复用配置映射PA9映射到串口
  79.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIO引脚复用配置映射PA10映射到串口

  80.         //USART1的PA9、PA10端口配置
  81.         gpioinit.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;    // 引脚9
  82.         gpioinit.GPIO_Mode = GPIO_Mode_AF;  // 模式位复用模式
  83.         gpioinit.GPIO_OType = GPIO_OType_PP ;// 输出类型是推免输出 初始状态
  84.         gpioinit.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  85.         gpioinit.GPIO_Speed = GPIO_Speed_100MHz ; // 速度
  86.         GPIO_Init(GPIOA,&gpioinit);

  87.   //USART1 初始化设置
  88.         initusart.USART_BaudRate=Bound_1;//波特率
  89.         initusart.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流  TEC CTC 什么一些鬼东西哦
  90.         initusart.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;     //模式,使能发送或者接受
  91.         initusart.USART_Parity = USART_Parity_No;             //奇偶校验位
  92.         initusart.USART_StopBits = USART_StopBits_1 ;         //停止位
  93.         initusart.USART_WordLength = USART_WordLength_8b;     //字长为 8 位数据格式
  94.         USART_Init(USART1,&initusart);   //进行串口的初始化

  95.         USART_Cmd(USART1,ENABLE);   //串口使能函数
  96. #if EN_USART1_RX       

  97.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口接收完成中断
  98.         //USART_ITConfig(USART1,USART_IT_TC,ENABLE);//使能串口发送完成中断

  99.   // 初始化中断,USART1 NVIC配置
  100.         nvicinit.NVIC_IRQChannel=USART1_IRQn;//串口1中断通道
  101.         nvicinit.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
  102.         nvicinit.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级设置
  103.         nvicinit.NVIC_IRQChannelSubPriority=3;//响应优先级设置
  104.         NVIC_Init(&nvicinit);
  105.        
  106. #endif
  107.         //printf("\r\n串口1初始化完成\r\n");
  108. }

  109. /********************************************************
  110. 函数名称:USART1_IRQHandler
  111. 函数功能:串口1中断服务函数,进行数据的回传
  112. 入口参数:无
  113. 备    注:无
  114. 返回参数:无
  115. 作    者:
  116. ***********************************************************/
  117. //中断服务函数
  118. void USART1_IRQHandler(void)
  119. {
  120.         u8 Res;
  121. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  122.         OSIntEnter();   
  123. #endif
  124.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  125.         {
  126.                 Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
  127.                
  128.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  129.                 {
  130.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  131.                         {
  132.                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  133.                                 else USART_RX_STA|=0x8000;        //接收完成了
  134.                         }
  135.                         else //还没收到0X0D
  136.                         {       
  137.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  138.                                 else
  139.                                 {
  140.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  141.                                         USART_RX_STA++;
  142.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  143.                                 }                 
  144.                         }
  145.                 }                    
  146.   }
  147. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  148.         OSIntExit();                                                                                           
  149. #endif
  150. }

  151. int Usart1_Receivedata_1(void)
  152. {
  153.         u8 t,len; u16 times=0;
  154.         while(1)
  155.         {
  156.                 if(USART_RX_STA&0x8000)
  157.                 {
  158.                         printf("\r\n 成功接收到您发送的信息!\r\n");
  159.                         len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  160.                         printf("\r\n 您发送的消息为:\r\n");
  161.                         printf("\r\n\r\n");//插入换行
  162.                         for(t=0;t<len;t++)
  163.                         {
  164.                                 USART1->DR=USART_RX_BUF[t];
  165.                                 while((USART1->SR&0X40)==0);//等待发送结束
  166.                                 //USART_SendData(USART1, USART_RX_BUF[t]); //向串口 1 发送数据
  167.                                 //while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完成
  168.                         }
  169.                         printf("\r\n\r\n");//插入换行
  170.                         USART_RX_STA=0;
  171.                         return 0;
  172.                 }
  173.                 else
  174.                 {
  175.                         times++;
  176.                         if(times%200==0)printf("请输入数据,以回车键结束\r\n");
  177.                         //if(times%30==0)LED0=!LED0;//闪烁 LED,提示系统正在运行.
  178.                         delay_ms(10);
  179.                 }
  180.         }
  181. }<div class="blockcode"><blockquote>void OLED_Init(void)
  182. {
  183.         SPI1_Init();  //初始化SPI2
  184.         OLED_Init_GPIO(); //初始化GPIO
  185.         delay_ms(200);
  186.         OLED_Reset();     //复位OLED

  187. /**************初始化SSD1306*****************/       
  188.         OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/
  189.         OLED_WR_Byte(0x00,OLED_CMD); /*set lower column address*/
  190.         OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/
  191.         OLED_WR_Byte(0x40,OLED_CMD); /*set display start line*/
  192.         OLED_WR_Byte(0xB0,OLED_CMD); /*set page address*/
  193.         OLED_WR_Byte(0x81,OLED_CMD); /*contract control*/
  194.         OLED_WR_Byte(0xFF,OLED_CMD); /*128*/
  195.         OLED_WR_Byte(0xA1,OLED_CMD); /*set segment remap*/
  196.         OLED_WR_Byte(0xA6,OLED_CMD); /*normal / reverse*/
  197.         OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/
  198.         OLED_WR_Byte(0x3F,OLED_CMD); /*duty = 1/64*/
  199.         OLED_WR_Byte(0xC8,OLED_CMD); /*Com scan direction*/
  200.         OLED_WR_Byte(0xD3,OLED_CMD); /*set display offset*/
  201.         OLED_WR_Byte(0x00,OLED_CMD);
  202.         OLED_WR_Byte(0xD5,OLED_CMD); /*set osc division*/
  203.         OLED_WR_Byte(0x80,OLED_CMD);
  204.         OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/
  205.         OLED_WR_Byte(0XF1,OLED_CMD);
  206.         OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/
  207.         OLED_WR_Byte(0x12,OLED_CMD);
  208.         OLED_WR_Byte(0xDB,OLED_CMD); /*set vcomh*/
  209.         OLED_WR_Byte(0x30,OLED_CMD);
  210.         OLED_WR_Byte(0x8D,OLED_CMD); /*set charge pump disable*/
  211.         OLED_WR_Byte(0x14,OLED_CMD);
  212.         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  213. }  
  214. void SPI1_Init(void)       
  215. {
  216.         GPIO_InitTypeDef  GPIO_InitStructure;
  217.   SPI_InitTypeDef  SPI_InitStructure;
  218.        
  219.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  220.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟

  221.   //GPIOFB3,4,5初始化设置
  222.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5复用功能输出       
  223.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  224.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  225.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  226.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  227.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  228.        
  229.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1
  230.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4复用为 SPI1
  231.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5复用为 SPI1

  232.         //这里只针对SPI口初始化
  233.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
  234.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1

  235.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  236.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  237.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
  238.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
  239.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
  240.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  241.         //SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;                //定义波特率预分频的值:波特率预分频值为256
  242.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  243.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
  244.         SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

  245.         SPI_Cmd(SPI1, ENABLE); //使能SPI外设       
  246. }
  247. void OLED_Init_GPIO(void)
  248. {
  249.         GPIO_InitTypeDef  GPIO_InitStructure;
  250.              
  251.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB ,ENABLE);
  252.        
  253.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12|GPIO_Pin_14| GPIO_Pin_15; //GPIOB12,14,15
  254.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  255.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  256.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //推挽输出
  257.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  258.         GPIO_Init(GPIOB, &GPIO_InitStructure);        //初始化GPIOB12,14,15
  259. }
复制代码



#endif





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2022-4-16 10:11:33 | 显示全部楼层
从程序上看,引脚配置这些没有看出来有什么冲突,单独使用能正常的话估计还是程序哪里没配置好导致的,可以跑下仿真试试看的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表