22 #include "sysconfig.h" 28 #include "stm32f7xx_hal.h" 29 #include "stm32f7xx_hal_tim.h" 35 #define ARDUINO_PWM_D6_Pin GPIO_PIN_6 36 #define ARDUINO_PWM_D6_GPIO_Port GPIOH 38 TIM_HandleTypeDef htim12;
41 static void MX_TIM12_Init(
void)
43 TIM_ClockConfigTypeDef sClockSourceConfig;
44 TIM_MasterConfigTypeDef sMasterConfig;
45 TIM_OC_InitTypeDef sConfigOC;
47 htim12.Instance = TIM12;
48 htim12.Init.Prescaler = 0;
49 htim12.Init.CounterMode = TIM_COUNTERMODE_UP;
50 htim12.Init.Period = 0;
51 htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
53 if(HAL_TIM_Base_Init(&htim12) != HAL_OK) {
54 SYSERR_PRINT(
"TIM12 Initialize error.\n");
57 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
58 if(HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK) {
59 SYSERR_PRINT(
"TIM12 Clock Initialize error.\n");
62 if(HAL_TIM_OC_Init(&htim12) != HAL_OK) {
63 SYSERR_PRINT(
"TIM12 IC Initialize error.\n");
66 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
67 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
68 if(HAL_TIMEx_MasterConfigSynchronization(&htim12, &sMasterConfig) != HAL_OK) {
69 SYSERR_PRINT(
"TIM12 MC Initialize error.\n");
72 sConfigOC.OCMode = TIM_OCMODE_TIMING;
74 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
75 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
76 if(HAL_TIM_OC_ConfigChannel(&htim12, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {
77 SYSERR_PRINT(
"TIM12 OC Config error.\n");
81 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
83 GPIO_InitTypeDef GPIO_InitStruct;
84 if(htim_base->Instance==TIM12) {
85 __HAL_RCC_TIM12_CLK_ENABLE();
87 GPIO_InitStruct.Pin = ARDUINO_PWM_D6_Pin;
88 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
89 GPIO_InitStruct.Pull = GPIO_NOPULL;
90 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
91 GPIO_InitStruct.Alternate = GPIO_AF9_TIM12;
92 HAL_GPIO_Init(ARDUINO_PWM_D6_GPIO_Port, &GPIO_InitStruct);
97 void start_tim12(
void)
102 void on_buzzer(
long cycle)
104 TIM_OC_InitTypeDef sConfigOC;
106 if(cycle > 0x3FFFF) {
107 DKPRINTF(0x01,
"Invalid CYCLE = %d\n", (
int)cycle);
109 }
else if(cycle > 0x1FFFF) {
110 htim12.Init.Prescaler = 2;
111 htim12.Init.Period = cycle/4;
112 }
else if(cycle > 0xFFFF) {
113 htim12.Init.Prescaler = 1;
114 htim12.Init.Period = cycle/2;
116 htim12.Init.Prescaler = 0;
117 htim12.Init.Period = cycle;
120 DKPRINTF(0x01,
"Clock Prescaler = %d, Period = %d\n",
121 (
int)htim12.Init.Prescaler, (
int)htim12.Init.Period);
123 if(HAL_TIM_Base_Init(&htim12) != HAL_OK) {
124 SYSERR_PRINT(
"TIM12 Initialize error.\n");
127 sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
128 sConfigOC.Pulse = htim12.Init.Period/2;
129 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
130 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
131 HAL_TIM_OC_ConfigChannel(&htim12, &sConfigOC, TIM_CHANNEL_1);
133 HAL_TIM_OC_Start(&htim12, TIM_CHANNEL_1);
136 void off_buzzer(
void)
138 HAL_TIM_OC_Stop(&htim12, TIM_CHANNEL_1);
141 static int buzzer_register(
struct st_device *dev,
char *param)
148 static int buzzer_unregister(
struct st_device *dev)
155 static int buzzer_open(
struct st_device *dev)
160 static int buzzer_close(
struct st_device *dev)
167 static int buzzer_ioctl(
struct st_device *dev,
long com,
long arg)
176 long cycle = (CPU_CLOCK_HZ/4) / arg;
177 DKPRINTF(0x01,
"CYCLE = %d\n", (
int)cycle);
184 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
191 static int buzzer_suspend(
struct st_device *dev)
198 static int buzzer_resume(
struct st_device *dev)
205 const device buzzer_device = {
207 .explan =
"STM32F7 TIM12 buzzer",
208 .register_dev = buzzer_register,
209 .unregister_dev = buzzer_unregister,
211 .close = buzzer_close,
212 .ioctl = buzzer_ioctl,
213 .suspend = buzzer_suspend,
214 .resume = buzzer_resume,
#define IOCMD_BUZZER_OFF
ブザー音声出力停止
#define DEF_DEV_NAME_BUZZER
標準ブザーデバイス名
#define IOCMD_BUZZER_ON
ブザー音声出力開始