OpenEdv-开源电子网

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

【STM32F103c8t6】蓝牙控制DFplayer模块(mp3模块)失败

[复制链接]

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2021-7-22
在线时间
28 小时
发表于 2022-5-18 15:39:33 | 显示全部楼层 |阅读模式
串口1(myus.c)代码(负责蓝牙的数据接收和数据处理)
  1.     #include "myus.h"
  2.     #include "mp3.h"
  3.     #include "usart.h"
  4.     void My_US_Init(void)
  5.     {

  6.     u8 i;
  7.     u8 len;
  8.     u16 times=0;

  9.     GPIO_InitTypeDef GPIO_InitStrue;
  10.     USART_InitTypeDef USART_InitStrue;
  11.     NVIC_InitTypeDef NVIC_InitStrue;
  12.     //使能串口,GPIo
  13.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  14.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口,GPIO的时钟使能
  15.     //初始化GPIO
  16.     //PA9-TX,PA10-RX
  17.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
  18.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
  19.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  20.     GPIO_Init(GPIOA,&GPIO_InitStrue);

  21.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空
  22.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
  23.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  24.     GPIO_Init(GPIOA,&GPIO_InitStrue);
  25.     //初始化串口
  26.     USART_InitStrue.USART_BaudRate=115200;//9600 115200 38400
  27.     USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用硬件流
  28.     USART_InitStrue.USART_Mode=USART_Mode_Rx |USART_Mode_Tx ;//RXTX都要
  29.     USART_InitStrue.USART_Parity=USART_Parity_No;//不用奇偶校验
  30.     USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位为1
  31.     USART_InitStrue.USART_WordLength=USART_WordLength_8b;//没有奇偶校验,8位
  32.     USART_Init(USART1,&USART_InitStrue);

  33.     USART_Cmd(USART1,ENABLE);//使能串口
  34.     //开启中断
  35.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//ITConfig就是在什么情况下开启中断 接收缓存区非空
  36.     //初始化中断
  37.     NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
  38.     NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
  39.     NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
  40.     NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
  41.     NVIC_Init(&NVIC_InitStrue);//中断初始化
  42.     }

  43.     void USART1_IRQHandler(void)
  44.     {
  45.     u8 res;
  46.     if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
  47.     {
  48.     res=USART_ReceiveData(USART1);
  49.     switch(res)
  50.     {
  51.     (此处省略一些无关case)
  52.     //---------------------------------MP3模块------------------------------------------------------------------------------
  53.     case 0x10:

  54.     MP3_PLAY();
  55.     break;

  56.     }
  57.     }

  58.     }



复制代码

usart.c代码(主要用来配置串口3,串口3用来发送数据来实现控制mp3模块)
  1. #include "sys.h"
  2. #include "usart.h"          
  3. //////////////////////////////////////////////////////////////////////////////////          
  4. //如果使用ucos,则包括下面的头文件即可.
  5. #if SYSTEM_SUPPORT_OS
  6. #include "includes.h"                                        //ucos 使用          
  7. #endif
  8. //////////////////////////////////////////////////////////////////////////////////         
  9. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  10. //ALIENTEK STM32开发板
  11. //串口1初始化                  
  12. //正点原子@ALIENTEK
  13. //技术论坛:www.openedv.com
  14. //修改日期:2012/8/18
  15. //版本:V1.5
  16. //版权所有,盗版必究。
  17. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  18. //All rights reserved
  19. //********************************************************************************
  20. //V1.3修改说明
  21. //支持适应不同频率下的串口波特率设置.
  22. //加入了对printf的支持
  23. //增加了串口接收命令功能.
  24. //修正了printf第一个字符丢失的bug
  25. //V1.4修改说明
  26. //1,修改串口初始化IO的bug
  27. //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
  28. //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
  29. //4,修改了EN_USART1_RX的使能方式
  30. //V1.5修改说明
  31. //1,增加了对UCOSII的支持
  32. //////////////////////////////////////////////////////////////////////////////////           


  33. //////////////////////////////////////////////////////////////////
  34. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  35. #if 1
  36. #pragma import(__use_no_semihosting)            
  37. //标准库需要的支持函数                 
  38. struct __FILE
  39. {
  40.         int handle;

  41. };

  42. FILE __stdout;      
  43. //定义_sys_exit()以避免使用半主机模式   
  44. _sys_exit(int x)
  45. {
  46.         x = x;
  47. }
  48. //重定义fputc函数
  49. int fputc(int ch, FILE *f)
  50. {      
  51.         while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
  52.     USART1->DR = (u8) ch;      
  53.         return ch;
  54. }
  55. #endif

  56. /*使用microLib的方法*/
  57. /*
  58. int fputc(int ch, FILE *f)
  59. {
  60.         USART_SendData(USART1, (uint8_t) ch);

  61.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}       
  62.    
  63.     return ch;
  64. }
  65. int GetKey (void)  {

  66.     while (!(USART1->SR & USART_FLAG_RXNE));

  67.     return ((int)(USART1->DR & 0x1FF));
  68. }
  69. */

  70. #if EN_USART1_RX   //如果使能了接收
  71. //串口1中断服务程序
  72. //注意,读取USARTx->SR能避免莫名其妙的错误          
  73. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  74. //接收状态
  75. //bit15,        接收完成标志
  76. //bit14,        接收到0x0d
  77. //bit13~0,        接收到的有效字节数目
  78. u16 USART_RX_STA=0;       //接收状态标记          
  79.   
  80. void uart_init(u32 bound){
  81.   //GPIO端口设置
  82.   GPIO_InitTypeDef GPIO_InitStructure;
  83.         USART_InitTypeDef USART_InitStructure;
  84.         NVIC_InitTypeDef NVIC_InitStructure;
  85.          
  86.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
  87.   
  88.         //USART1_TX   GPIOA.9
  89.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  90.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  91.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  92.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  93.    
  94.   //USART1_RX          GPIOA.10初始化
  95.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  96.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  97.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  98.   //Usart1 NVIC 配置
  99.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  100.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
  101.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级3
  102.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  103.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  104.   
  105.    //USART 初始化设置

  106.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  107.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  108.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  109.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  110.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  111.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  112.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  113.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  114.   USART_Cmd(USART1, ENABLE);                    //使能串口1

  115. }


  116. #endif       

  117. #if EN_USART3   //如果使能了接收
  118. u8 USART3_RX_BUF[USART3_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  119. //接收状态
  120. //bit15,        接收完成标志
  121. //bit14,        接收到0x0d
  122. //bit13~0,        接收到的有效字节数目
  123. u16 USART3_RX_STA=0;       //接收状态标记          

  124. /*
  125. USART3专用的printf函数
  126. 当同时开启2个以上串口时,printf函数只能用于其中之一,其他串口要自创独立的printf函数
  127. 调用方法:USART3_printf("123"); //向USART3发送字符123
  128. */
  129. void USART3_printf (char *fmt, ...){
  130.         char buffer[USART3_REC_LEN+1];  // 数据长度
  131.         u8 i = 0;       
  132.         va_list arg_ptr;
  133.         va_start(arg_ptr, fmt);  
  134.         vsnprintf(buffer, USART3_REC_LEN+1, fmt, arg_ptr);
  135.         while ((i < USART3_REC_LEN) && (i < strlen(buffer))){
  136.         USART_SendData(USART3, (u8) buffer[i++]);
  137.         while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
  138.         }
  139.         va_end(arg_ptr);
  140. }

  141. void USART3_Init(u32 BaudRate){ //USART3初始化并启动
  142.    GPIO_InitTypeDef GPIO_InitStructure;
  143.    USART_InitTypeDef USART_InitStructure;
  144.    NVIC_InitTypeDef NVIC_InitStructure;

  145.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能UART3所在GPIOB的时钟
  146.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能串口的RCC时钟

  147.    //串口使用的GPIO口配置
  148.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//设置USART3的RX接口是PB11
  149.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//接口模式 浮空输入
  150.    GPIO_Init(GPIOB, &GPIO_InitStructure);

  151.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//设置USART3的TX接口是PB10
  152.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度50MHz
  153.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//接口模式 复用推挽输出
  154.    GPIO_Init(GPIOB, &GPIO_InitStructure);
  155.    //Usart1 NVIC 配置
  156.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  157.     NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  158.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  159.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
  160.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  161.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  162.    //配置串口
  163.    USART_InitStructure.USART_BaudRate = BaudRate;
  164.    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  165.    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  166.    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  167.    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  168.    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  169.    USART_Init(USART3, &USART_InitStructure);//配置串口3
  170.    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//使能串口接收中断  
  171.    USART_Cmd(USART3, ENABLE);//使能串口3

  172. }
  173. //串口3中断服务程序
  174. void USART3_IRQHandler(void){        
  175.     u8 Res;
  176.     if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){  //接收中断
  177.         Res =USART_ReceiveData(USART3);//读取接收到的数据
  178.         if(Res=='S'){//判断数据是否是STOP(省略读取S)            
  179.             USART3_RX_STA=1;//如果是STOP则标志位为1      
  180.         }else if(Res=='K'){//判断数据是否是OK(省略读取K)            
  181.             USART3_RX_STA=2;//如果是OK则标志位为2      
  182.         }            
  183.     }
  184. }
  185. #endif       
复制代码




mp3.c代码
  1. #include "mp3.h"
  2. #include "usart.h"
  3. void MP3_Init(void){ //初始化
  4.         USART3_Init(9600);//串口3初始化并启动
  5.         MP3_STOP(); //上电初始化后发送一次指令激活MP3芯片
  6. }
  7. void MP3_PLAY(void){ //播放
  8.         USART3_printf("\x7E \xFF \x06 \x03 \x00 \x00 \x01 \xEF"); //其中 \x 后接十六进制数据
  9. }
  10. void MP3_PAUSE(void){ //暂停
  11.         USART3_printf("\x7e\x03\x12\x11\xef");
  12. }
  13. void MP3_PREV(void){ //上一曲
  14.         USART3_printf("\x7e\x03\x14\x17\xef");
  15. }
  16. void MP3_NEXT(void){ //下一曲
  17.         USART3_printf("\x7e\x03\x13\x10\xef");
  18. }
  19. void MP3_VUP(void){ //音量加1
  20.         USART3_printf("\x7e\x03\x15\x16\xef");
  21. }
  22. void MP3_VDOWN(void){ //音量减1
  23.         USART3_printf("\x7e\x03\x16\x15\xef");
  24. }
  25. void MP3_STOP(void){ //停止
  26.         USART3_printf("\x7e\x03\x1E\x1D\xef");
  27. }
复制代码
main.c代码
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "myus.h"
  4. #include "mp3.h"
  5. #include "usart.h"

  6. int main(void)
  7. {       
  8.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  9.         delay_init();
  10.         My_US_Init();
  11.     MP3_Init();
  12.   while(1)
  13.         {               

  14.         }
  15. }
复制代码
总工程师编译没有错误,只有有个别警告。不知道是配置还是思路逻辑的问题,发送0x01,串口3也不知道有没有数据传出去(MP3模块是没有反应),MP3模块小白求助!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

114

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1128
金钱
1128
注册时间
2021-6-17
在线时间
206 小时
发表于 2022-5-18 15:47:06 | 显示全部楼层
不知道串口有没有发送数据,连个串口助手看一下不就知道了?
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2021-7-22
在线时间
28 小时
 楼主| 发表于 2022-5-18 19:08:59 | 显示全部楼层
ZKX182 发表于 2022-5-18 15:47
不知道串口有没有发送数据,连个串口助手看一下不就知道了?

串口助手看过了,就是因为串口助手也没有数据,不知道是连线的问题还是代码的问题还是软件的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 04:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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