找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4259|回复: 2
打印 上一主题 下一主题
收起左侧

自己做的USB声卡,stm32f103rbt6源码

[复制链接]
跳转到指定楼层
楼主
ID:407262 发表于 2018-10-9 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB声卡,用STM32F103RBT6制作,使用TIM驱动IO,PWM方式推挽音频输出,驱动8欧姆的喇叭不成问题,仅作为桌面音源使用。

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32f1xx_hal.h"
  3. #include "usb_device.h"

  4. /* USER CODE BEGIN Includes */
  5. #include "uart_printf.h"
  6. #include "usbd_audio.h"
  7. /* USER CODE END Includes */

  8. /* Private variables ---------------------------------------------------------*/
  9. volatile USBD_HandleTypeDef hUsbDeviceFS;
  10. UART_HandleTypeDef huart1;
  11. TIM_HandleTypeDef htim2;
  12. TIM_HandleTypeDef htim3;
  13. TIM_HandleTypeDef htim4;
  14. volatile uint8_t Mute;
  15. uint8_t buffer[AUDIO_TOTAL_BUF_SIZE];

  16. /* USER CODE BEGIN PV */
  17. /* Private variables ---------------------------------------------------------*/

  18. /* USER CODE END PV */

  19. /* Private function prototypes -----------------------------------------------*/
  20. void SystemClock_Config(void);
  21. void Error_Handler(void);
  22. static void MX_GPIO_Init(void);
  23. static void MX_TIM3_Init(void);
  24. static void MX_TIM4_Init(void);
  25. static void MX_TIM2_Init(void);
  26. static void MX_USART1_UART_Init(void);


  27. void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
  28. /* USER CODE BEGIN PFP */
  29. /* Private function prototypes -----------------------------------------------*/

  30. /* USER CODE END PFP */

  31. /* USER CODE BEGIN 0 */
  32. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  33. {
  34.         uint8_t data_tmp;
  35.         if(htim->Instance == TIM2)
  36.         {
  37.                 USBD_AUDIO_HandleTypeDef *haudio = (USBD_AUDIO_HandleTypeDef*)(hUsbDeviceFS.pClassData);
  38.                 if(haudio->rd_enable == 1)
  39.                 {
  40.                         //if(haudio->data_len >= 4)
  41.                         {
  42.                                 uint8_t pulse, pulsen;
  43.                                 haudio->rd_ptr++;
  44.                                 data_tmp = buffer[haudio->rd_ptr & (AUDIO_TOTAL_BUF_SIZE - 1)];
  45.                                 pulse = (uint8_t)(data_tmp + 0x80);
  46.                                 pulsen = (uint8_t)((~data_tmp) + 0x80);
  47.                                 TIM3->CCR3 = pulse;
  48.                                 TIM3->CCR4 = pulsen;
  49.                                 haudio->rd_ptr++;
  50.                                 haudio->rd_ptr++;
  51.                                 data_tmp = buffer[haudio->rd_ptr & (AUDIO_TOTAL_BUF_SIZE - 1)];
  52.                                 pulse = (uint8_t)(data_tmp + 0x80);
  53.                                 pulsen = (uint8_t)((~data_tmp) + 0x80);
  54.                                 TIM4->CCR3 = pulse;
  55.                                 TIM4->CCR4 = pulsen;
  56.                                 haudio->rd_ptr++;
  57.                                 haudio->rd_ptr &= (2 * AUDIO_TOTAL_BUF_SIZE -1);
  58.                                 if(haudio->rd_ptr == haudio->wr_ptr)
  59.                                         haudio->rd_enable = 0;
  60.                         }
  61.                 }
  62.         }
  63. }
  64. /* USER CODE END 0 */

  65. int main(void)
  66. {
  67.   /* USER CODE BEGIN 1 */

  68.   /* USER CODE END 1 */

  69.   /* MCU Configuration----------------------------------------------------------*/

  70.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  71.   HAL_Init();

  72.   /* Configure the system clock */
  73.   SystemClock_Config();

  74.   /* Initialize all configured peripherals */
  75.   MX_GPIO_Init();
  76.   MX_USART1_UART_Init();
  77.   MX_TIM3_Init();
  78.         MX_TIM4_Init();
  79.   MX_TIM2_Init();
  80.   MX_USB_DEVICE_Init();

  81.   /* USER CODE BEGIN 2 */
  82.         Mute = 0;
  83.   /* USER CODE END 2 */

  84.   /* Infinite loop */
  85.   /* USER CODE BEGIN WHILE */
  86.   while (1)
  87.   {
  88.   /* USER CODE END WHILE */
  89. //                printf("This is A USB-AUDIO Device\r\n");
  90. //                HAL_Delay(1000);

  91.   /* USER CODE BEGIN 3 */

  92.   }
  93.   /* USER CODE END 3 */

  94. }

  95. /** System Clock Configuration
  96. */
  97. void SystemClock_Config(void)
  98. {
  99.   RCC_OscInitTypeDef RCC_OscInitStruct;
  100.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  101.   RCC_PeriphCLKInitTypeDef PeriphClkInit;

  102.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  103.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  104.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  105.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  106.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  107.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  108.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  109.   {
  110.     Error_Handler();
  111.   }

  112.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  113.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  114.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  115.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  116.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  117.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  118.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  119.   {
  120.     Error_Handler();
  121.   }

  122.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
  123.   PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
  124.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  125.   {
  126.     Error_Handler();
  127.   }

  128.   HAL_RCC_EnableCSS();

  129.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  130.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  131.   /* SysTick_IRQn interrupt configuration */
  132.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  133. }

  134. /* USART1 init function */
  135. static void MX_USART1_UART_Init(void)
  136. {
  137.   huart1.Instance = USART1;
  138.   huart1.Init.BaudRate = 115200;
  139.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  140.   huart1.Init.StopBits = UART_STOPBITS_1;
  141.   huart1.Init.Parity = UART_PARITY_NONE;
  142.   huart1.Init.Mode = UART_MODE_TX_RX;
  143.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  144.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  145.   if (HAL_UART_Init(&huart1) != HAL_OK)
  146.   {
  147.     Error_Handler();
  148.   }
  149. }

  150. /* TIM2 init function */
  151. static void MX_TIM2_Init(void)
  152. {
  153.   TIM_ClockConfigTypeDef sClockSourceConfig;
  154.   TIM_MasterConfigTypeDef sMasterConfig;

  155.   htim2.Instance = TIM2;
  156.   htim2.Init.Prescaler = 0;
  157.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  158.   htim2.Init.Period = 2249;
  159.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  160.   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  161.   {
  162.     Error_Handler();
  163.   }

  164.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  165.   if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  166.   {
  167.     Error_Handler();
  168.   }

  169.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  170.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  171.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  172.   {
  173.     Error_Handler();
  174.   }
  175. }

  176. /* TIM3 init function */
  177. static void MX_TIM3_Init(void)
  178. {
  179.   TIM_ClockConfigTypeDef sClockSourceConfig;
  180. //  TIM_MasterConfigTypeDef sMasterConfig;
  181.   TIM_OC_InitTypeDef sConfigOC;

  182.   htim3.Instance = TIM3;
  183.   htim3.Init.Prescaler = 0;
  184.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  185.   htim3.Init.Period = 255;
  186.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  187.   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  188.   {
  189.     Error_Handler();
  190.   }

  191.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  192.   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  193.   {
  194.     Error_Handler();
  195.   }

  196. //  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  197. //  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  198. //  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  199. //  {
  200. //    Error_Handler();
  201. //  }

  202.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  203.   sConfigOC.Pulse = 0;
  204.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  205.   sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
  206.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  207.   {
  208.     Error_Handler();
  209.   }

  210.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  211.   {
  212.     Error_Handler();
  213.   }

  214.   HAL_TIM_MspPostInit(&htim3);
  215. }

  216. /* TIM4 init function */
  217. static void MX_TIM4_Init(void)
  218. {

  219.   TIM_ClockConfigTypeDef sClockSourceConfig;
  220. //  TIM_MasterConfigTypeDef sMasterConfig;
  221.   TIM_OC_InitTypeDef sConfigOC;

  222.   htim4.Instance = TIM4;
  223.   htim4.Init.Prescaler = 0;
  224.   htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  225.   htim4.Init.Period = 255;
  226.   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  227.   if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  228.   {
  229.     Error_Handler();
  230.   }

  231.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  232.   if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  233.   {
  234.     Error_Handler();
  235.   }
  236.        
  237. //  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  238. //  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  239. //  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  240. //  {
  241. //    Error_Handler();
  242. //  }

  243.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  244.   sConfigOC.Pulse = 0;
  245.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  246.   sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
  247.   if (HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  248.   {
  249.     Error_Handler();
  250.   }

  251.   if (HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  252.   {
  253.     Error_Handler();
  254.   }

  255.   HAL_TIM_MspPostInit(&htim4);
  256. }

  257. /** Configure pins as
  258.         * Analog
  259.         * Input
  260.         * Output
  261.         * EVENT_OUT
  262.         * EXTI
  263. */
  264. static void MX_GPIO_Init(void)
  265. {

  266.   GPIO_InitTypeDef GPIO_InitStruct;

  267.   /* GPIO Ports Clock Enable */
  268.   __HAL_RCC_GPIOD_CLK_ENABLE();
  269.   __HAL_RCC_GPIOB_CLK_ENABLE();
  270.   __HAL_RCC_GPIOA_CLK_ENABLE();

  271.   /*Configure GPIO pin : PA8 */
  272.   GPIO_InitStruct.Pin = GPIO_PIN_8;
  273.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  274.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  275.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  276.   /*Configure GPIO pin Output Level */
  277.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);

  278.   /*Configure GPIO pin : PD2 */
  279.   GPIO_InitStruct.Pin = GPIO_PIN_2;
  280.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  281.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  282.   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  283.   /*Configure GPIO pin Output Level */
  284.   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);

  285. }

  286. /* USER CODE BEGIN 4 */

  287. /* USER CODE END 4 */

  288. /**
  289.   * @brief  This function is executed in case of error occurrence.
  290.   * @param  None
  291.   * @retval None
  292.   */
  293. void Error_Handler(void)
  294. {
  295.   /* USER CODE BEGIN Error_Handler */
  296.   /* User can add his own implementation to report the HAL error return state */
  297.   while(1)
  298.   {
  299.   }
  300.   /* USER CODE END Error_Handler */
  301. }

  302. #ifdef USE_FULL_ASSERT

  303. /**
  304.    * @brief Reports the name of the source file and the source line number
  305.    * where the assert_param error has occurred.
  306.    * @param file: pointer to the source file name
  307.    * @param line: assert_param error line source number
  308.    * @retval None
  309.    */
  310. void assert_failed(uint8_t* file, uint32_t line)
  311. {
  312.   /* USER CODE BEGIN 6 */
  313.   /* User can add his own implementation to report the file name and line number,
  314.     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  315.   /* USER CODE END 6 */

  316. }

  317. #endif

  318. /**
  319.   * @}
  320.   */

  321. /**
  322.   * @}
  323. */

  324. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码

所有资料51hei提供下载:
USB_ADUIO_F1(原版PWM).rar (1.75 MB, 下载次数: 52)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:136005 发表于 2019-2-25 14:26 | 只看该作者
版主可以详细提供一下代码的工作原理不?
回复

使用道具 举报

板凳
ID:138119 发表于 2019-5-6 05:15 | 只看该作者
试了,电脑能识别到USB声卡设备,可是放音,除了吱吱的,根根什么也听不到啊?楼主能说一下问题所在吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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