BY9301.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. BY9301语音播报模块
  3. */
  4. #include "main.h"
  5. void BY9301_USART_Init(uint32_t baudRate);
  6. static void BY9301_SendString(uint8_t *str);
  7. static void BY9301_Say(uint8_t NOx);
  8. static uint8_t BY9301_Busy(void);
  9. BY9301ClassStruct BY9301Class = {
  10. .Init = BY9301_USART_Init,
  11. .Send = BY9301_SendString,
  12. .Say = BY9301_Say,
  13. .Busy = BY9301_Busy
  14. };
  15. // VOICE USART define
  16. #if 0
  17. #define BY9301_USARTx_PORT USART1
  18. #define BY9301_USARTx_CLK RCC_APB2Periph_USART1
  19. #define BY9301_USARTx_APBxClkCmd RCC_APB2PeriphClockCmd
  20. #define BY9301_USARTx_PORT_CLK (RCC_APB2Periph_GPIOA)
  21. #define BY9301_USARTx_PORT_APBxClkCmd RCC_APB2PeriphClockCmd
  22. #define BY9301_USARTx_TX_PORT GPIOA
  23. #define BY9301_USARTx_TX_PIN GPIO_Pin_9
  24. #define BY9301_USARTx_RX_PORT GPIOA
  25. #define BY9301_USARTx_RX_PIN GPIO_Pin_10
  26. #define BY9301_USARTx_IRQ USART1_IRQn
  27. #define BY9301_USARTx_IRQHandler USART1_IRQHandler
  28. #else
  29. #define BY9301_USARTx_PORT USART2
  30. #define BY9301_USARTx_CLK RCC_APB1Periph_USART2
  31. #define BY9301_USARTx_APBxClkCmd RCC_APB1PeriphClockCmd
  32. #define BY9301_USARTx_PORT_CLK (RCC_APB2Periph_GPIOA)
  33. #define BY9301_USARTx_PORT_APBxClkCmd RCC_APB2PeriphClockCmd
  34. #define BY9301_USARTx_TX_PORT GPIOA
  35. #define BY9301_USARTx_TX_PIN GPIO_Pin_2
  36. #define BY9301_USARTx_RX_PORT GPIOA
  37. #define BY9301_USARTx_RX_PIN GPIO_Pin_3
  38. #define BY9301_USARTx_IRQ USART2_IRQn
  39. #define BY9301_USARTx_IRQHandler USART2_IRQHandler
  40. #endif
  41. #define BUSY_GPIO_PORT GPIOA /* GPIO端口 */
  42. #define BUSY_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  43. #define BUSY_GPIO_PIN GPIO_Pin_4 /* 连接到SCL时钟线的GPIO */
  44. // BY9301TTS播报串口协议
  45. uint8_t BY9301Data[][8] = {
  46. {0x7e,0x04,0x31,0x1e,0x2b,0xef,'\n'}, // 设置音量30最大
  47. {0x7e,0x05,0x41,0x00,0x01,0x45,0xef,'\n'}, // 0001
  48. {0x7e,0x05,0x41,0x00,0x02,0x46,0xef,'\n'}, // 0002
  49. {0x7e,0x05,0x41,0x00,0x03,0x47,0xef,'\n'},
  50. {0x7e,0x05,0x41,0x00,0x04,0x40,0xef,'\n'},
  51. {0x7e,0x05,0x41,0x00,0x05,0x41,0xef,'\n'},
  52. {0x7e,0x05,0x41,0x00,0x06,0x42,0xef,'\n'},
  53. {0x7e,0x05,0x41,0x00,0x07,0x43,0xef,'\n'},
  54. {0x7e,0x05,0x41,0x00,0x08,0x4c,0xef,'\n'},
  55. {0x7e,0x05,0x41,0x00,0x09,0x4d,0xef,'\n'},
  56. {0x7e,0x05,0x41,0x00,0x0a,0x4e,0xef,'\n'},
  57. {0x7e,0x05,0x41,0x00,0x0b,0x4f,0xef,'\n'},
  58. {0x7e,0x05,0x41,0x00,0x0c,0x48,0xef,'\n'},
  59. {0x7e,0x05,0x41,0x00,0x0d,0x49,0xef,'\n'},
  60. {0x7e,0x05,0x41,0x00,0x0e,0x4a,0xef,'\n'},
  61. {0x7e,0x05,0x41,0x00,0x0f,0x4b,0xef,'\n'},
  62. {0x7e,0x05,0x41,0x00,0x10,0x54,0xef,'\n'},
  63. {0x7e,0x05,0x41,0x00,0x11,0x55,0xef,'\n'}, // 0017
  64. };
  65. void BY9301_USARTx_IRQHandler(void)
  66. {
  67. if(USART_GetITStatus(BY9301_USARTx_PORT, USART_IT_RXNE) != RESET) {
  68. USART_ClearITPendingBit(BY9301_USARTx_PORT, USART_IT_RXNE);
  69. }
  70. }
  71. /**
  72. * @brief 语音串口USART初始化
  73. * @param baudRate: 波特率
  74. * @retval None
  75. */
  76. static void BY9301_USART_Init(uint32_t baudRate)
  77. {
  78. NVIC_InitTypeDef NVIC_InitStructure;
  79. GPIO_InitTypeDef GPIO_InitStructure;
  80. USART_InitTypeDef USART_InitStructure;
  81. /* GPIO时钟配置 */
  82. BY9301_USARTx_PORT_APBxClkCmd(BY9301_USARTx_PORT_CLK, ENABLE);
  83. /* 串口时钟配置 */
  84. BY9301_USARTx_APBxClkCmd(BY9301_USARTx_CLK, ENABLE);
  85. /* USART Tx--复用推挽输出 */
  86. GPIO_InitStructure.GPIO_Pin = BY9301_USARTx_TX_PIN;
  87. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  88. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  89. GPIO_Init(BY9301_USARTx_TX_PORT, &GPIO_InitStructure);
  90. /* USART Rx--浮空输入 */
  91. GPIO_InitStructure.GPIO_Pin = BY9301_USARTx_RX_PIN;
  92. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  93. GPIO_Init(BY9301_USARTx_RX_PORT, &GPIO_InitStructure);
  94. // BUSY输入
  95. RCC_APB2PeriphClockCmd(BUSY_GPIO_CLK, ENABLE);
  96. GPIO_InitStructure.GPIO_Pin = BUSY_GPIO_PIN;
  97. GPIO_Init(BUSY_GPIO_PORT, &GPIO_InitStructure);
  98. /* 串口参数配置 */
  99. USART_InitStructure.USART_BaudRate = baudRate; // 波特率
  100. USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位
  101. USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位
  102. USART_InitStructure.USART_Parity = USART_Parity_No; // 校验位
  103. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控
  104. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 工作模式 收发一起
  105. USART_Init(BY9301_USARTx_PORT, &USART_InitStructure); // 串口初始化
  106. /* 串口使能 */
  107. USART_Cmd(BY9301_USARTx_PORT, ENABLE);
  108. /* 串口中断使能 */
  109. USART_ITConfig(BY9301_USARTx_PORT, USART_IT_RXNE, ENABLE);
  110. /* NVIC优先级分组 */
  111. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  112. /* NVIC参数配置*/
  113. NVIC_InitStructure.NVIC_IRQChannel = BY9301_USARTx_IRQ; // 中断源 有特定的命名
  114. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 主优先级
  115. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
  116. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能NVIC
  117. NVIC_Init(&NVIC_InitStructure); // NVIC初始化
  118. }
  119. /**
  120. * @brief 语音串口发送 具体协议参见手册 最后一个字节以\0结尾
  121. * @param str: 要发送的内容
  122. * @retval None
  123. */
  124. static void BY9301_SendString(uint8_t *str)
  125. {
  126. unsigned int k=0;
  127. do
  128. {
  129. USART_SendData(BY9301_USARTx_PORT, *(str + k) );
  130. /* 等待发送数据寄存器为空 */
  131. while (USART_GetFlagStatus(BY9301_USARTx_PORT, USART_FLAG_TXE) == RESET){}
  132. k++;
  133. }while(*(str + k)!= '\n');
  134. /* 等待发送完成 */
  135. while(USART_GetFlagStatus(BY9301_USARTx_PORT, USART_FLAG_TC) == RESET){}
  136. }
  137. /**
  138. * @brief 指定序号播报
  139. * @param NOx: mp3文件序号
  140. * @retval None
  141. */
  142. static void BY9301_Say(uint8_t NOx)
  143. {
  144. BY9301_SendString(BY9301Data[NOx]);
  145. }
  146. /**
  147. * @brief Busy引脚状态
  148. * @param None
  149. * @retval 返回Busy引脚电平状态
  150. */
  151. static uint8_t BY9301_Busy(void)
  152. {
  153. return GPIO_ReadInputDataBit(BUSY_GPIO_PORT, BUSY_GPIO_PIN);
  154. }