├── Liek DC Motor Library 2.3 ├── Sample main code.c ├── dc_motor_library.c └── dc_motor_library.h ├── Liek DC Motor Library v1.8 ├── dc_motor_library.c ├── dc_motor_library.h └── sample main code.c ├── Liek DC Motor Library v2.4 ├── Sample main.c ├── dc_motor_library.c └── dc_motor_library.h ├── README.md └── dcmotor_lib.pdf /Liek DC Motor Library 2.3/Sample main code.c: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 2.3 4 | @date: 27.04.2021 5 | ************************************************************/ 6 | 7 | #include "stm32f10x.h" // Device header 8 | #include "dc_motor_library.h" 9 | 10 | Motor Motor1; 11 | 12 | int main(){ 13 | 14 | Motor1.backward_port=GPIOA; 15 | Motor1.backward_pin= GPIO_Pin_4; 16 | 17 | Motor1.forward_port=GPIOA; 18 | Motor1.forward_pin=GPIO_Pin_5; 19 | 20 | basic_motorConf(Motor1); 21 | 22 | while(1){ 23 | 24 | basic_motorRun(Motor1,'b'); 25 | Motor_Delay(3000); 26 | 27 | Motor_Stop(Motor1); 28 | Motor_Delay(500); 29 | 30 | basic_motorRun(Motor1,'f'); 31 | Motor_Delay(3000); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Liek DC Motor Library 2.3/dc_motor_library.c: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 2.3 4 | @date: 27.04.2021 5 | ************************************************************/ 6 | 7 | #include "stm32f10x.h" // Device header 8 | #include "dc_motor_library.h" 9 | #include "stm32f10x_tim.h" // Keil::Device:StdPeriph Drivers:TIM 10 | 11 | GPIO_InitTypeDef MotorGPIOInitStructure; 12 | 13 | int counter = 0; 14 | 15 | void systemClockEnable(void){ 16 | SystemCoreClockUpdate(); 17 | SysTick_Config(SystemCoreClock/1000); 18 | } 19 | 20 | void SysTick_Handler(void){ 21 | if(counter>0){ 22 | counter--; 23 | } 24 | } 25 | 26 | void Motor_Delay(uint32_t time){ 27 | systemClockEnable(); 28 | counter=time; 29 | while(counter); 30 | } 31 | 32 | void Motor_Conf(Motor Port_Pin, uint16_t speed, char direction){ 33 | 34 | uint16_t timPulse = 24*speed; 35 | 36 | if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_0){ 37 | 38 | 39 | RCC->APB1ENR |= 0x1; 40 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 41 | GPIOA->CRL &= 0xFFFFFFF0; 42 | GPIOA->CRL |= 0xB; 43 | TIM2->CCER |= 0x1; 44 | TIM2->CR1 |= 0x80; 45 | TIM2->CCMR1 |= 0x68; 46 | TIM2->ARR = 2399; 47 | TIM2->PSC = 10; 48 | TIM2->CCR1 = timPulse; 49 | TIM2->EGR |= 0x1; 50 | TIM2->CR1 |= 0x1; 51 | 52 | 53 | } 54 | 55 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_1){ 56 | 57 | RCC->APB1ENR |= 0x1; 58 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 59 | GPIOA->CRL &= 0xFFFFFF0F; 60 | GPIOA->CRL |= (0xB<<4); 61 | TIM2->CCER |= 0x10; 62 | TIM2->CR1 |= 0x80; 63 | TIM2->CCMR1 |= 0x6800; 64 | TIM2->ARR = 2399; 65 | TIM2->PSC = 10; 66 | TIM2->CCR2= timPulse; 67 | TIM2->EGR |= 0x1; 68 | TIM2->CR1 |= 0x1; 69 | } 70 | 71 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_2){ 72 | RCC->APB1ENR |= 0x1; 73 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 74 | GPIOA->CRL &= 0xFFFFF0FF; 75 | GPIOA->CRL |= (0xB<<8); 76 | TIM2->CCER |= 0x100; 77 | TIM2->CR1 |= 0x80; 78 | TIM2->CCMR2 |= 0x68; 79 | TIM2->ARR = 2399; 80 | TIM2->PSC = 10; 81 | TIM2->CCR3 = timPulse; 82 | TIM2->EGR |= 0x1; 83 | TIM2->CR1 |= 0x1; 84 | } 85 | 86 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_3){ 87 | 88 | RCC->APB1ENR |= 0x1; 89 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 90 | GPIOA->CRL &= 0xFFFF0FFF; 91 | GPIOA->CRL |= (0xB<<12); 92 | TIM2->CCER |= 0x1000; 93 | TIM2->CR1 |= 0x80; 94 | TIM2->CCMR2 |= 0x6800; 95 | TIM2->ARR = 2399; 96 | TIM2->PSC = 10; 97 | TIM2->CCR4 = timPulse; 98 | TIM2->EGR |= 0x1; 99 | TIM2->CR1 |= 0x1; 100 | 101 | } 102 | 103 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_6){ 104 | 105 | RCC->APB1ENR |= (0x1<<1); 106 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 107 | GPIOA->CRL &= 0xF0FFFFFF; 108 | GPIOA->CRL |= (0xB<<24); 109 | TIM3->CCER |= 0x1; 110 | TIM3->CR1 |= 0x80; 111 | TIM3->CCMR1 |= 0x68; 112 | TIM3->ARR = 2399; 113 | TIM3->PSC= 10; 114 | TIM3->CCR1 = timPulse; 115 | TIM3->EGR |= 0x1; 116 | TIM3->CR1 |=0x1; 117 | 118 | 119 | } 120 | 121 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_7){ 122 | 123 | RCC->APB1ENR |= (0x1<<1); 124 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 125 | GPIOA->CRL &= 0x0FFFFFFF; 126 | GPIOA->CRL |= (0xB<<28); 127 | TIM3->CCER |= 0x10; 128 | TIM3->CR1 |= 0x80; 129 | TIM3->CCMR1 |= 0x6800; 130 | TIM3->ARR = 2399; 131 | TIM3->PSC = 10; 132 | TIM3->CCR2 = timPulse; 133 | TIM3->EGR |= 0x1; 134 | TIM3->CR1 |=0x1; 135 | 136 | } 137 | 138 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_8){ 139 | 140 | RCC->APB2ENR |= (0x1<<11); 141 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 142 | GPIOA->CRH &= 0xFFFFFFF0; 143 | GPIOA->CRH |= 0xB; 144 | TIM1->CCER |= 0x1; 145 | TIM1->CR1 |= 0x80; 146 | TIM1->CCMR1 |= 0x68; 147 | TIM1->ARR = 2399; 148 | TIM1->PSC = 10; 149 | TIM1->CCR1 = timPulse; 150 | TIM1->EGR |= 0x1; 151 | TIM1->CR1 |=0x1; 152 | 153 | 154 | } 155 | 156 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_9){ 157 | 158 | RCC->APB2ENR |= (0x1<<11); 159 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 160 | GPIOA->CRH &= 0xFFFFFF0F; 161 | GPIOA->CRH |= (0xB<<4); 162 | TIM1->CCER |= 0x10; 163 | TIM1->CR1 |= 0x80; 164 | TIM1->CCMR1 |= 0x6800; 165 | TIM1->ARR = 2399; 166 | TIM1->PSC = 10; 167 | TIM1->CCR2 = timPulse; 168 | TIM1->EGR |= 0x1; 169 | TIM1->CR1 |=0x1; 170 | 171 | 172 | } 173 | 174 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_10){ 175 | 176 | RCC->APB2ENR |= (0x1<<11); 177 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 178 | GPIOA->CRH &= 0xFFFFF0FF; 179 | GPIOA->CRH |= (0xB<<8); 180 | TIM1->CCER |= 0x100; 181 | TIM1->CR1 |= 0x80; 182 | TIM1->CCMR2 |= 0x68; 183 | TIM1->ARR = 2399; 184 | TIM1->PSC = 10; 185 | TIM1->CCR3 = timPulse; 186 | TIM1->EGR |= 0x1; 187 | TIM1->CR1 |=0x1; 188 | 189 | 190 | } 191 | 192 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_11){ 193 | 194 | RCC->APB2ENR |= (0x1<<11); 195 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 196 | GPIOA->CRH &= 0xFFFF0FFF; 197 | GPIOA->CRH |= (0xB<<12); 198 | TIM1->CCER |= 0x1000; 199 | TIM1->CR1 |= 0x80; 200 | TIM1->CCMR2 |= 0x6800; 201 | TIM1->ARR = 2399; 202 | TIM1->PSC = 10; 203 | TIM1->CCR4 = timPulse; 204 | TIM1->EGR |= 0x1; 205 | TIM1->CR1 |=0x1; 206 | 207 | } 208 | 209 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_15){ 210 | 211 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 212 | RCC->APB1ENR |= 0x1; 213 | GPIOA->CRH &= 0x0FFFFFFF; 214 | GPIOA->CRH |= (0xB<<28); 215 | TIM2->CCER |= 0x1; 216 | TIM2->CR1 |= 0x80; 217 | TIM2->CCMR1 |= 0x68; 218 | TIM2->ARR = 2399; 219 | TIM2->PSC = 10; 220 | TIM2->CCR1 = timPulse; 221 | TIM2->EGR |= 0x1; 222 | TIM2->CR1 |=0x1; 223 | 224 | 225 | 226 | } 227 | 228 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_0){ 229 | 230 | RCC->APB1ENR |= (0x1<<1); 231 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 232 | GPIOB->CRL &= 0xFFFFFFF0; 233 | GPIOB->CRL |= 0xB; 234 | TIM3->CCER |= 0x100; 235 | TIM3->CR1 |= 0x80; 236 | TIM3->CCMR2 |= 0x68; 237 | TIM3->ARR = 2399; 238 | TIM3->PSC = 10; 239 | TIM3->CCR3 = timPulse; 240 | TIM3->EGR |= 0x1; 241 | TIM3->CR1 |=0x1; 242 | 243 | 244 | 245 | } 246 | 247 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_1){ 248 | 249 | RCC->APB1ENR |= (0x1<<1); 250 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 251 | GPIOB->CRL &= 0xFFFFFF0F; 252 | GPIOB->CRL |= (0xB<<4); 253 | TIM3->CCER |= 0x1000; 254 | TIM3->CR1 |= 0x80; 255 | TIM3->CCMR2 |= 0x6800; 256 | TIM2->ARR = 2399; 257 | TIM2->PSC = 10; 258 | TIM2->CCR4 = timPulse; 259 | TIM2->EGR |= 0x1; 260 | TIM2->CR1 |=0x1; 261 | 262 | 263 | 264 | } 265 | 266 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_3){ 267 | 268 | RCC->APB1ENR |= 0x1; 269 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 270 | GPIOB->CRL &= 0xFFFF0FFF; 271 | GPIOB->CRL |= (0xB<<12); 272 | TIM2->CCER |= 0x10; 273 | TIM2->CR1 |= 0x80; 274 | TIM2->CCMR1 |= 0x6800; 275 | TIM2->ARR = 2399; 276 | TIM2->PSC = 10; 277 | TIM2->CCR2 = timPulse; 278 | TIM2->EGR |= 0x1; ; 279 | TIM2->CR1 |=0x1; 280 | 281 | 282 | 283 | } 284 | 285 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_4){ 286 | 287 | RCC->APB1ENR |= (0x1<<1); 288 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 289 | GPIOB->CRL &= 0xFFF0FFFF; 290 | GPIOB->CRL |= (0xB<<16); 291 | TIM3->CCER |= 0x1; 292 | TIM3->CR1 |= 0x80; 293 | TIM3->CCMR1 |= 0x68; 294 | TIM3->ARR = 2399; 295 | TIM3->PSC = 10; 296 | TIM3->CCR1 = timPulse; 297 | TIM3->EGR |= 0x1; 298 | TIM3->CR1 |=0x1; 299 | 300 | 301 | 302 | } 303 | 304 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_5){ 305 | 306 | RCC->APB1ENR |= (0x1<<1); 307 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 308 | GPIOB->CRL &= 0xFF0FFFFF; 309 | GPIOB->CRL |= (0xB<<20); 310 | TIM3->CCER |= 0x10; 311 | TIM3->CR1 |= 0x80; 312 | TIM3->CCMR1 |= 0x6800; 313 | TIM3->ARR = 2399; 314 | TIM3->PSC = 10; 315 | TIM3->CCR2 = timPulse; 316 | TIM3->EGR |= 0x1; 317 | TIM3->CR1 |=0x1; 318 | 319 | 320 | 321 | } 322 | 323 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_10){ 324 | 325 | RCC->APB1ENR |= 0x1; 326 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 327 | GPIOB->CRH &= 0xFFFFF0FF; 328 | GPIOB->CRH |= (0xB<<8); 329 | TIM2->CCER |= 0x100; 330 | TIM2->CR1 |= 0x80; 331 | TIM2->CCMR2 |= 0x68; 332 | TIM2->ARR= 2399; 333 | TIM2->PSC = 10; 334 | TIM2->CR1 |= 0x80; 335 | TIM2->CCR3 = timPulse; 336 | TIM2->EGR |= 0x1; 337 | TIM2->CR1 |=0x1; 338 | } 339 | 340 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_11){ 341 | 342 | RCC->APB1ENR |= 0x1; 343 | RCC->APB2ENR |= 0x9; //GPIOB Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 344 | GPIOB->CRH &= 0xFFFF0FFF; 345 | GPIOB->CRH |= (0xB<<12); 346 | TIM2->CCER |= 0x1000; 347 | TIM2->CR1 |= 0x80; 348 | TIM2->CCMR2 |= 0x6800; 349 | TIM2->ARR = 2399; 350 | TIM2->PSC = 10; 351 | TIM2->CCR4 = timPulse; 352 | TIM2->EGR |= 0x1; 353 | TIM2->CR1 |=0x1; 354 | } 355 | 356 | // forward pin 357 | 358 | if(Port_Pin.forward_port == GPIOA) 359 | { 360 | RCC->APB2ENR |= (0x1<<2); 361 | }else if(Port_Pin.forward_port == GPIOB) 362 | { 363 | RCC->APB2ENR |= (0x1<<3); 364 | 365 | }else if(Port_Pin.forward_port == GPIOC) 366 | { 367 | RCC->APB2ENR |= (0x1<<4); 368 | 369 | }else if(Port_Pin.forward_port == GPIOD) 370 | { 371 | RCC->APB2ENR |= (0x1<<5); 372 | }else if(Port_Pin.forward_port == GPIOE) 373 | { 374 | RCC->APB2ENR |= (0x1<<6); 375 | } 376 | 377 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.forward_pin; 378 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 379 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 380 | GPIO_Init(Port_Pin.forward_port,&MotorGPIOInitStructure); 381 | 382 | 383 | // backward pin 384 | 385 | if(Port_Pin.backward_port == GPIOA) 386 | { 387 | RCC->APB2ENR |= (0x1<<2); 388 | 389 | }else if(Port_Pin.backward_port == GPIOB) 390 | { 391 | RCC->APB2ENR |= (0x1<<3); 392 | 393 | }else if(Port_Pin.backward_port == GPIOC) 394 | { 395 | RCC->APB2ENR |= (0x1<<4); 396 | 397 | }else if(Port_Pin.backward_port == GPIOD) 398 | { 399 | 400 | RCC->APB2ENR |= (0x1<<5); 401 | 402 | }else if(Port_Pin.backward_port == GPIOE) 403 | { 404 | 405 | RCC->APB2ENR |= (0x1<<6); 406 | } 407 | 408 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.backward_pin; 409 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 410 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 411 | GPIO_Init(Port_Pin.backward_port,&MotorGPIOInitStructure); 412 | 413 | 414 | 415 | // motor direction 416 | if(direction=='f'){ 417 | 418 | GPIO_SetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 419 | GPIO_ResetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 420 | } 421 | 422 | else if(direction=='b'){ 423 | 424 | GPIO_ResetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 425 | GPIO_SetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 426 | 427 | 428 | } 429 | 430 | 431 | 432 | 433 | } 434 | 435 | void basic_motorConf(Motor Port_Pin){ 436 | 437 | // forward port_pin 438 | 439 | if(Port_Pin.forward_port == GPIOA) 440 | { 441 | RCC->APB2ENR |= (0x1<<2); 442 | }else if(Port_Pin.forward_port == GPIOB) 443 | { 444 | RCC->APB2ENR |= (0x1<<3); 445 | 446 | }else if(Port_Pin.forward_port == GPIOC) 447 | { 448 | RCC->APB2ENR |= (0x1<<4); 449 | 450 | }else if(Port_Pin.forward_port == GPIOD) 451 | { 452 | RCC->APB2ENR |= (0x1<<5); 453 | 454 | }else if(Port_Pin.forward_port == GPIOE) 455 | { 456 | 457 | RCC->APB2ENR |= (0x1<<6); 458 | } 459 | 460 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.forward_pin; 461 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 462 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 463 | GPIO_Init(Port_Pin.forward_port,&MotorGPIOInitStructure); 464 | 465 | 466 | // backward port_pin 467 | 468 | if(Port_Pin.backward_port == GPIOA) 469 | { 470 | RCC->APB2ENR |= (0x1<<2); 471 | }else if(Port_Pin.backward_port == GPIOB) 472 | { 473 | RCC->APB2ENR |= (0x1<<3); 474 | 475 | }else if(Port_Pin.backward_port == GPIOC) 476 | { 477 | RCC->APB2ENR |= (0x1<<4); 478 | 479 | }else if(Port_Pin.backward_port == GPIOD) 480 | { 481 | 482 | RCC->APB2ENR |= (0x1<<5); 483 | 484 | }else if(Port_Pin.backward_port == GPIOE) 485 | { 486 | RCC->APB2ENR |= (0x1<<6); 487 | 488 | } 489 | 490 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.backward_pin; 491 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 492 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 493 | GPIO_Init(Port_Pin.backward_port,&MotorGPIOInitStructure); 494 | 495 | 496 | } 497 | 498 | 499 | void basic_motorRun(Motor Port_Pin,char direction){ 500 | 501 | // motor direction 502 | if(direction=='f'){ 503 | 504 | GPIO_SetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 505 | GPIO_ResetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 506 | } 507 | 508 | else if(direction=='b'){ 509 | 510 | GPIO_ResetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 511 | GPIO_SetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 512 | } 513 | 514 | 515 | } 516 | void Motor_Stop(Motor Port_Pin){ 517 | 518 | GPIO_ResetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 519 | GPIO_ResetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 520 | } 521 | -------------------------------------------------------------------------------- /Liek DC Motor Library 2.3/dc_motor_library.h: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 2.3 4 | @date: 27.04.2021 5 | 6 | ************************************************************/ 7 | 8 | #include "stm32f10x.h" // Device header 9 | #include "stm32f10x_tim.h" // Keil::Device:StdPeriph Drivers:TIM 10 | #include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO 11 | 12 | 13 | typedef struct MotorStruct{ 14 | 15 | GPIO_TypeDef* pwm_port; 16 | uint16_t pwm_pin; 17 | 18 | GPIO_TypeDef* forward_port; 19 | uint16_t forward_pin; 20 | 21 | GPIO_TypeDef* backward_port; 22 | uint16_t backward_pin; 23 | 24 | GPIO_TypeDef* port; 25 | uint16_t pin; 26 | 27 | }Motor; 28 | 29 | void Motor_Conf(Motor Port_Pin, uint16_t speed, char direction); 30 | void Motor_Delay(uint32_t time); 31 | void basic_motorConf(Motor Port_Pin); 32 | void basic_motorRun(Motor Port_Pin,char direction); 33 | void Motor_Stop(Motor Port_Pin); -------------------------------------------------------------------------------- /Liek DC Motor Library v1.8/dc_motor_library.c: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 1.8 4 | @date: 03.04.2021 5 | ************************************************************/ 6 | 7 | #include "stm32f10x.h" // Device header 8 | #include "dc_motor_library.h" 9 | #include "stm32f10x_tim.h" // Keil::Device:StdPeriph Drivers:TIM 10 | 11 | GPIO_InitTypeDef MotorGPIOInitStructure; 12 | TIM_OCInitTypeDef TIMER_OCInitStructure; 13 | TIM_TimeBaseInitTypeDef TIMERInitstructure; 14 | 15 | int counter = 0; 16 | 17 | void systemClockEnable(void){ 18 | SystemCoreClockUpdate(); 19 | SysTick_Config(SystemCoreClock/1000); 20 | } 21 | 22 | void SysTick_Handler(void){ 23 | if(counter>0){ 24 | counter--; 25 | } 26 | } 27 | 28 | void Motor_Delay(uint32_t time){ 29 | systemClockEnable(); 30 | counter=time; 31 | while(counter); 32 | } 33 | 34 | void timer_configure(uint16_t TIM){ 35 | 36 | if(TIM ==1){ 37 | 38 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); 39 | 40 | TIMERInitstructure.TIM_ClockDivision=TIM_CKD_DIV1; 41 | TIMERInitstructure.TIM_CounterMode=TIM_CounterMode_Up; 42 | TIMERInitstructure.TIM_Period=2399; 43 | TIMERInitstructure.TIM_Prescaler=10; 44 | TIMERInitstructure.TIM_RepetitionCounter=0; 45 | 46 | TIM_TimeBaseInit(TIM1,&TIMERInitstructure); 47 | TIM_Cmd(TIM1,ENABLE); 48 | } 49 | if(TIM ==2){ 50 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 51 | 52 | TIMERInitstructure.TIM_ClockDivision=TIM_CKD_DIV1; 53 | TIMERInitstructure.TIM_CounterMode=TIM_CounterMode_Up; 54 | TIMERInitstructure.TIM_Period=2399; 55 | TIMERInitstructure.TIM_Prescaler=10; 56 | TIMERInitstructure.TIM_RepetitionCounter=0; 57 | 58 | TIM_TimeBaseInit(TIM2,&TIMERInitstructure); 59 | TIM_Cmd(TIM2,ENABLE); 60 | } 61 | if(TIM ==3){ 62 | 63 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 64 | 65 | TIMERInitstructure.TIM_ClockDivision=TIM_CKD_DIV1; 66 | TIMERInitstructure.TIM_CounterMode=TIM_CounterMode_Up; 67 | TIMERInitstructure.TIM_Period=2399; 68 | TIMERInitstructure.TIM_Prescaler=10; 69 | TIMERInitstructure.TIM_RepetitionCounter=0; 70 | 71 | TIM_TimeBaseInit(TIM3,&TIMERInitstructure); 72 | TIM_Cmd(TIM3,ENABLE); 73 | } 74 | if(TIM ==4){ 75 | 76 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); 77 | 78 | TIMERInitstructure.TIM_ClockDivision=TIM_CKD_DIV1; 79 | TIMERInitstructure.TIM_CounterMode=TIM_CounterMode_Up; 80 | TIMERInitstructure.TIM_Period=2399; 81 | TIMERInitstructure.TIM_Prescaler=10; 82 | TIMERInitstructure.TIM_RepetitionCounter=0; 83 | 84 | TIM_TimeBaseInit(TIM4,&TIMERInitstructure); 85 | TIM_Cmd(TIM4,ENABLE); 86 | } 87 | } 88 | 89 | void Motor_Conf(Motor Port_Pin){ 90 | 91 | // pwm port 92 | if(Port_Pin.pwm_port == GPIOA) 93 | { 94 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 95 | }else if(Port_Pin.pwm_port == GPIOB) 96 | { 97 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 98 | 99 | }else if(Port_Pin.pwm_port == GPIOC) 100 | { 101 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 102 | 103 | }else if(Port_Pin.pwm_port == GPIOD) 104 | { 105 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 106 | }else if(Port_Pin.pwm_port == GPIOE) 107 | { 108 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); 109 | } 110 | 111 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.pwm_pin; 112 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_AF_PP; 113 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 114 | GPIO_Init(Port_Pin.pwm_port,&MotorGPIOInitStructure); 115 | 116 | // pwm pin 117 | 118 | if (Port_Pin.pwm_port== GPIOA && Port_Pin.pwm_pin == GPIO_Pin_0) {timer_configure(2);} 119 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_1) {timer_configure(2);} 120 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_2) {timer_configure(2);} 121 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_3) {timer_configure(2);} 122 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_6) {timer_configure(3);} 123 | else if(Port_Pin.pwm_port== GPIOA && Port_Pin.pwm_pin == GPIO_Pin_7) {timer_configure(3);} 124 | else if(Port_Pin.pwm_port== GPIOA && Port_Pin.pwm_pin == GPIO_Pin_8) {timer_configure(1);} 125 | else if(Port_Pin.pwm_port== GPIOA && Port_Pin.pwm_pin == GPIO_Pin_9) {timer_configure(1);} 126 | else if(Port_Pin.pwm_port== GPIOA && Port_Pin.pwm_pin == GPIO_Pin_10){timer_configure(1);} 127 | else if(Port_Pin.pwm_port== GPIOA && Port_Pin.pwm_pin == GPIO_Pin_11){timer_configure(1);} 128 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_15){timer_configure(2);} 129 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_0) {timer_configure(3);} 130 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_1) {timer_configure(2);} 131 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_3) {timer_configure(2);} 132 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_4) {timer_configure(3);} 133 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_5) {timer_configure(3);} 134 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_10){timer_configure(2);} 135 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_11){timer_configure(2);} 136 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_13){timer_configure(1);} 137 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_14){timer_configure(1);} 138 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_15){timer_configure(1);} 139 | 140 | // forward pin 141 | 142 | if(Port_Pin.forward_port == GPIOA) 143 | { 144 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 145 | }else if(Port_Pin.forward_port == GPIOB) 146 | { 147 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 148 | 149 | }else if(Port_Pin.forward_port == GPIOC) 150 | { 151 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 152 | 153 | }else if(Port_Pin.forward_port == GPIOD) 154 | { 155 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 156 | }else if(Port_Pin.forward_port == GPIOE) 157 | { 158 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); 159 | } 160 | 161 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.forward_pin; 162 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 163 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 164 | GPIO_Init(Port_Pin.forward_port,&MotorGPIOInitStructure); 165 | 166 | // backward pin 167 | 168 | if(Port_Pin.backward_port == GPIOA) 169 | { 170 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 171 | }else if(Port_Pin.backward_port == GPIOB) 172 | { 173 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 174 | 175 | }else if(Port_Pin.backward_port == GPIOC) 176 | { 177 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 178 | 179 | }else if(Port_Pin.backward_port == GPIOD) 180 | { 181 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 182 | }else if(Port_Pin.backward_port == GPIOE) 183 | { 184 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); 185 | } 186 | 187 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.backward_pin; 188 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 189 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 190 | GPIO_Init(Port_Pin.backward_port,&MotorGPIOInitStructure); 191 | } 192 | 193 | void Pwm_MotorRun(Motor Port_Pin,uint16_t speed, char direction){ 194 | uint16_t timPulse = 24*speed; 195 | 196 | // motor direction 197 | if(direction=='f'){ 198 | 199 | GPIO_SetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 200 | GPIO_ResetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 201 | } 202 | 203 | else if(direction=='b'){ 204 | 205 | GPIO_ResetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 206 | GPIO_SetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 207 | } 208 | 209 | // motor speed 210 | 211 | TIMER_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; // bu ve alttaki 2 satir conf a tasinabilir 212 | TIMER_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; 213 | TIMER_OCInitStructure.TIM_OCNPolarity=TIM_OCPolarity_High; 214 | TIMER_OCInitStructure.TIM_Pulse=timPulse; 215 | 216 | if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin== GPIO_Pin_1){ 217 | 218 | TIM_OC2Init(TIM2,&TIMER_OCInitStructure); 219 | TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); 220 | } 221 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_2){ 222 | 223 | TIM_OC3Init(TIM2,&TIMER_OCInitStructure); 224 | TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable); 225 | } 226 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_3){ 227 | 228 | TIM_OC4Init(TIM2,&TIMER_OCInitStructure); 229 | TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable); 230 | } 231 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_6){ 232 | 233 | TIM_OC1Init(TIM3,&TIMER_OCInitStructure); 234 | TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); 235 | } 236 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_7){ 237 | 238 | TIM_OC2Init(TIM3,&TIMER_OCInitStructure); 239 | TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); 240 | } 241 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_8){ 242 | 243 | TIM_OC1Init(TIM1,&TIMER_OCInitStructure); 244 | TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); 245 | } 246 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_9){ 247 | 248 | TIM_OC2Init(TIM1,&TIMER_OCInitStructure); 249 | TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable); 250 | } 251 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_10){ 252 | 253 | TIM_OC3Init(TIM1,&TIMER_OCInitStructure); 254 | TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable); 255 | } 256 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_11){ 257 | 258 | TIM_OC4Init(TIM1,&TIMER_OCInitStructure); 259 | TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable); 260 | } 261 | 262 | else if(Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_15){ 263 | 264 | TIM_OC1Init(TIM2,&TIMER_OCInitStructure); 265 | TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); 266 | } 267 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_0){ 268 | 269 | TIM_OC3Init(TIM3,&TIMER_OCInitStructure); 270 | TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); 271 | } 272 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_1){ 273 | 274 | TIM_OC4Init(TIM3,&TIMER_OCInitStructure); 275 | TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable); 276 | } 277 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_3){ 278 | 279 | TIM_OC2Init(TIM2,&TIMER_OCInitStructure); 280 | TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); 281 | } 282 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_4){ 283 | 284 | TIM_OC1Init(TIM3,&TIMER_OCInitStructure); 285 | TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); 286 | } 287 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_5){ 288 | 289 | TIM_OC2Init(TIM3,&TIMER_OCInitStructure); 290 | TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); 291 | } 292 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_10){ 293 | 294 | TIM_OC3Init(TIM2,&TIMER_OCInitStructure); 295 | TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable); 296 | } 297 | else if(Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_11){ 298 | 299 | TIM_OC4Init(TIM2,&TIMER_OCInitStructure); 300 | TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable); 301 | } 302 | } 303 | 304 | void Motor_Stop(Motor Port_Pin){ 305 | 306 | GPIO_ResetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 307 | GPIO_ResetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 308 | } 309 | 310 | void Basic_MotorConf(Motor Port_Pin){ 311 | 312 | // forward port_pin 313 | 314 | if(Port_Pin.forward_port == GPIOA) 315 | { 316 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 317 | }else if(Port_Pin.forward_port == GPIOB) 318 | { 319 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 320 | 321 | }else if(Port_Pin.forward_port == GPIOC) 322 | { 323 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 324 | 325 | }else if(Port_Pin.forward_port == GPIOD) 326 | { 327 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 328 | }else if(Port_Pin.forward_port == GPIOE) 329 | { 330 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); 331 | } 332 | 333 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.forward_pin; 334 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 335 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 336 | GPIO_Init(Port_Pin.forward_port,&MotorGPIOInitStructure); 337 | 338 | // backward port_pin 339 | 340 | if(Port_Pin.backward_port == GPIOA) 341 | { 342 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 343 | }else if(Port_Pin.backward_port == GPIOB) 344 | { 345 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 346 | 347 | }else if(Port_Pin.backward_port == GPIOC) 348 | { 349 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 350 | 351 | }else if(Port_Pin.backward_port == GPIOD) 352 | { 353 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 354 | }else if(Port_Pin.backward_port == GPIOE) 355 | { 356 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); 357 | } 358 | 359 | MotorGPIOInitStructure.GPIO_Pin=Port_Pin.backward_pin; 360 | MotorGPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 361 | MotorGPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; 362 | GPIO_Init(Port_Pin.backward_port,&MotorGPIOInitStructure); 363 | } 364 | 365 | void Basic_MotorRun(Motor Port_Pin,char direction){ 366 | 367 | // motor direction 368 | if(direction=='f'){ 369 | 370 | GPIO_SetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 371 | GPIO_ResetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 372 | } 373 | else if(direction=='b'){ 374 | 375 | GPIO_ResetBits(Port_Pin.forward_port,Port_Pin.forward_pin); 376 | GPIO_SetBits(Port_Pin.backward_port,Port_Pin.backward_pin); 377 | } 378 | } 379 | -------------------------------------------------------------------------------- /Liek DC Motor Library v1.8/dc_motor_library.h: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 1.8 4 | @date: 03.04.2021 5 | ************************************************************/ 6 | 7 | #include "stm32f10x.h" // Device header 8 | #include "stm32f10x_tim.h" // Keil::Device:StdPeriph Drivers:TIM 9 | #include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO 10 | 11 | typedef struct MotorStruct{ 12 | 13 | GPIO_TypeDef* pwm_port; 14 | uint16_t pwm_pin; 15 | 16 | GPIO_TypeDef* forward_port; 17 | uint16_t forward_pin; 18 | 19 | GPIO_TypeDef* backward_port; 20 | uint16_t backward_pin; 21 | 22 | GPIO_TypeDef* port; 23 | uint16_t pin; 24 | 25 | }Motor; 26 | 27 | void Motor_Conf(Motor Port_Pin); 28 | void Motor_Delay(uint32_t time); 29 | void Pwm_MotorRun(Motor Port_Pin,uint16_t speed, char direction); 30 | void timer_configure(uint16_t TIM); 31 | void Basic_MotorConf(Motor Port_Pin); 32 | void Basic_MotorRun(Motor Port_Pin,char direction); 33 | void Motor_Stop(Motor Port_Pin); 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Liek DC Motor Library v1.8/sample main code.c: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 1.8 4 | @date: 03.04.2021 5 | ************************************************************/ 6 | 7 | #include "stm32f10x.h" // Device header 8 | #include "dc_motor_library.h" 9 | 10 | Motor Motor1; 11 | 12 | int main(){ 13 | 14 | Motor1.backward_port=GPIOA; 15 | Motor1.backward_pin= GPIO_Pin_1; 16 | 17 | Motor1.forward_port=GPIOA; 18 | Motor1.forward_pin=GPIO_Pin_2; 19 | 20 | Motor1.pwm_pin=GPIO_Pin_3; 21 | Motor1.pwm_port=GPIOA; 22 | 23 | Motor_Conf(Motor1); 24 | 25 | while(1){ 26 | 27 | Pwm_MotorRun(Motor1,90,'f'); 28 | 29 | Motor_Delay(3000); 30 | 31 | Motor_Stop(Motor1); 32 | Motor_Delay(500); 33 | 34 | Pwm_MotorRun(Motor1,70,'b'); 35 | Motor_Delay(3000); 36 | 37 | Motor_Stop(Motor1); 38 | Motor_Delay(500); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Liek DC Motor Library v2.4/Sample main.c: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 2.4 4 | @date: 01.05.2021 5 | -PWM pins for speed control: A0,A1,...,A7 and B0. Other pwm pins does not work. 6 | -Digital pins for direction: All GPIO pins except A15, B3, B4. 7 | ************************************************************/ 8 | #include "dc_motor_library.h" 9 | 10 | Motor Motor1; // The object "Motor1" has been set in the Motor structure. The object name (Motor1) depends on the user. 11 | 12 | int main(){ 13 | 14 | Motor1.pwm_port = GPIOA; // Port and pin assignments for pwm 15 | Motor1.pwm_pin = GPIO_Pin_7; // If pwm not used, pwm_port and pwm_pin assignments are unnecessary. 16 | 17 | Motor1.backward_port = GPIOB; // Port and pin assignments for forward direction 18 | Motor1.backward_pin = GPIO_Pin_12; // port = GPIOx & pin = GPIO_Pin_x 19 | 20 | Motor1.forward_port = GPIOA; // Port and pin assignments for backward direction 21 | Motor1.forward_pin = GPIO_Pin_9; // port = GPIOx & pin = GPIO_Pin_x 22 | 23 | MotorConfig(Motor1); // DC Motor configuration including pwm settings 24 | // If pwm not used, Basic_MotorConfig() function have to be used instead of MotorConfig(). 25 | while(1){ 26 | 27 | MotorRun(Motor1,100,'b'); // Running function with pwm // MotorRun(Motor object, speed(min:0 max:100), direction('f':forward & 'b':backward)) 28 | // If pwm not used, Basic_MotorRun() function have to be used instead of MotorRun(). // Basic_MotorRun(Motor object, direction('f':forward & 'b':backward)) 29 | Motor_Delay(3000); 30 | 31 | Motor_Stop(Motor1); // Motor_Stop(Motor object) 32 | Motor_Delay(800); // Motor_Delay(time(millisecond)) 33 | 34 | MotorRun(Motor1,75,'f'); // %75 speed and forward direction for Motor1 35 | Motor_Delay(3000); 36 | 37 | Motor_Stop(Motor1); 38 | Motor_Delay(800); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Liek DC Motor Library v2.4/dc_motor_library.c: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 2.4 4 | @date: 01.05.2021 5 | -PWM pins for speed control: A0,A1,...,A7 and B0. Other pwm pins does not work. 6 | -Digital pins for direction: All GPIO pins except A15, B3, B4. 7 | ************************************************************/ 8 | #include "stm32f10x.h" // Device header 9 | #include "dc_motor_library.h" 10 | 11 | uint32_t delay_counter = 0; // The counter for delay function 12 | 13 | void systemClockEnable(void){ 14 | 15 | SystemCoreClockUpdate(); 16 | SysTick_Config(SystemCoreClock/1000); 17 | } 18 | 19 | void SysTick_Handler(void){ 20 | if(delay_counter>0){ 21 | delay_counter--; 22 | } 23 | } 24 | 25 | void Motor_Delay(uint32_t time){ // Real time delay function 26 | 27 | systemClockEnable(); 28 | delay_counter=time; 29 | while(delay_counter); 30 | } 31 | 32 | void MotorRun(Motor Port_Pin, uint16_t speed, char direction){ // Running function with pwm 33 | 34 | uint16_t timPulse = 24*speed; // sets the period range between 0 and 100 35 | 36 | if(direction=='f'){ // motor direction 37 | 38 | Port_Pin.forward_port->BSRR = Port_Pin.forward_pin; // high voltage for forward pin 39 | Port_Pin.backward_port->BRR = Port_Pin.backward_pin; // low voltage for backward pin 40 | } 41 | else if(direction=='b'){ // motor direction 42 | 43 | Port_Pin.backward_port->BSRR = Port_Pin.backward_pin; // high voltage for backward pin 44 | Port_Pin.forward_port->BRR = Port_Pin.forward_pin; // low voltage for forward pin 45 | } 46 | 47 | if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_0){ // running with pwm 48 | 49 | TIM2->CCR1 = timPulse; // CCR = timPulse [Duty Cycle = (CCR/ARR)*100] 50 | TIM2->EGR |= 0x1; // Update generation enable 51 | TIM2->CR1 |= 0x1; // Relevant timer enable 52 | } 53 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_1){ 54 | 55 | TIM2->CCR2= timPulse; 56 | TIM2->EGR |= 0x1; 57 | TIM2->CR1 |= 0x1; 58 | } 59 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_2){ 60 | 61 | TIM2->CCR3 = timPulse; 62 | TIM2->EGR |= 0x1; 63 | TIM2->CR1 |= 0x1; 64 | } 65 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_3){ 66 | 67 | TIM2->CCR4 = timPulse; 68 | TIM2->EGR |= 0x1; 69 | TIM2->CR1 |= 0x1; 70 | } 71 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_6){ 72 | 73 | TIM3->CCR1 = timPulse; 74 | TIM3->EGR |= 0x1; 75 | TIM3->CR1 |=0x1; 76 | } 77 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_7){ 78 | 79 | TIM3->CCR2 = timPulse; 80 | TIM3->EGR |= 0x1; 81 | TIM3->CR1 |=0x1; 82 | } 83 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_8){ 84 | 85 | TIM1->CCR1 = timPulse; 86 | TIM1->EGR |= 0x1; 87 | TIM1->CR1 |=0x1; 88 | } 89 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_9){ 90 | 91 | TIM1->CCR2 = timPulse; 92 | TIM1->EGR |= 0x1; 93 | TIM1->CR1 |=0x1; 94 | } 95 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_10){ 96 | 97 | TIM1->CCR3 = timPulse; 98 | TIM1->EGR |= 0x1; 99 | TIM1->CR1 |=0x1; 100 | } 101 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_11){ 102 | 103 | TIM1->CCR4 = timPulse; 104 | TIM1->EGR |= 0x1; 105 | TIM1->CR1 |=0x1; 106 | } 107 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_15){ 108 | 109 | TIM2->CCR1 = timPulse; 110 | TIM2->EGR |= 0x1; 111 | TIM2->CR1 |=0x1; 112 | } 113 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_0){ 114 | 115 | TIM3->CCR3 = timPulse; 116 | TIM3->EGR |= 0x1; 117 | TIM3->CR1 |=0x1; 118 | } 119 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_1){ 120 | 121 | TIM2->CCR4 = timPulse; 122 | TIM2->EGR |= 0x1; 123 | TIM2->CR1 |=0x1; 124 | } 125 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_3){ 126 | 127 | TIM2->CCR2 = timPulse; 128 | TIM2->EGR |= 0x1; 129 | TIM2->CR1 |=0x1; 130 | } 131 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_4){ 132 | 133 | TIM3->CCR1 = timPulse; 134 | TIM3->EGR |= 0x1; 135 | TIM3->CR1 |=0x1; 136 | } 137 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_5){ 138 | 139 | TIM3->CCR2 = timPulse; 140 | TIM3->EGR |= 0x1; 141 | TIM3->CR1 |=0x1; 142 | } 143 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_10){ 144 | 145 | TIM2->CCR3 = timPulse; 146 | TIM2->EGR |= 0x1; 147 | TIM2->CR1 |=0x1; 148 | } 149 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_11){ 150 | 151 | TIM2->CCR4 = timPulse; 152 | TIM2->EGR |= 0x1; 153 | TIM2->CR1 |=0x1; 154 | } 155 | } 156 | 157 | void MotorConfig(Motor Port_Pin){ // DC Motor configuration including pwm settings 158 | 159 | if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_0){ // GPIO and timer configurations 160 | 161 | RCC->APB1ENR |= 0x1; // Timer settings 162 | RCC->APB2ENR |= 0x5; // GPIO settings 163 | GPIOA->CRL &= 0xFFFFFFF0; // Relevant bits have set to 0 164 | GPIOA->CRL |= 0xB; // Output mode and speed settings 165 | TIM2->CCER |= 0x1; // Capture/ compare output configuration 166 | TIM2->CR1 |= 0x80; // Auto preload enable 167 | TIM2->CCMR1 |= 0x68; // Output compare and pwm mode configurations 168 | TIM2->ARR = 2399; // Period = 2400 169 | TIM2->PSC = 10; // Prescaler = 10 170 | } 171 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_1){ 172 | 173 | RCC->APB1ENR |= 0x1; 174 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 175 | GPIOA->CRL &= 0xFFFFFF0F; 176 | GPIOA->CRL |= (0xB<<4); 177 | TIM2->CCER |= 0x10; 178 | TIM2->CR1 |= 0x80; 179 | TIM2->CCMR1 |= 0x6800; 180 | TIM2->ARR = 2399; 181 | TIM2->PSC = 10; 182 | } 183 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_2){ 184 | 185 | RCC->APB1ENR |= 0x1; 186 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 187 | GPIOA->CRL &= 0xFFFFF0FF; 188 | GPIOA->CRL |= (0xB<<8); 189 | TIM2->CCER |= 0x100; 190 | TIM2->CR1 |= 0x80; 191 | TIM2->CCMR2 |= 0x68; 192 | TIM2->ARR = 2399; 193 | TIM2->PSC = 10; 194 | } 195 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_3){ 196 | 197 | RCC->APB1ENR |= 0x1; 198 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 199 | GPIOA->CRL &= 0xFFFF0FFF; 200 | GPIOA->CRL |= (0xB<<12); 201 | TIM2->CCER |= 0x1000; 202 | TIM2->CR1 |= 0x80; 203 | TIM2->CCMR2 |= 0x6800; 204 | TIM2->ARR = 2399; 205 | TIM2->PSC = 10; 206 | } 207 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_6){ 208 | 209 | RCC->APB1ENR |= (0x1<<1); 210 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 211 | GPIOA->CRL &= 0xF0FFFFFF; 212 | GPIOA->CRL |= (0xB<<24); 213 | TIM3->CCER |= 0x1; 214 | TIM3->CR1 |= 0x80; 215 | TIM3->CCMR1 |= 0x68; 216 | TIM3->ARR = 2399; 217 | TIM3->PSC= 10; 218 | } 219 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_7){ 220 | 221 | RCC->APB1ENR |= (0x1<<1); 222 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 223 | GPIOA->CRL &= 0x0FFFFFFF; 224 | GPIOA->CRL |= (0xB<<28); 225 | TIM3->CCER |= 0x10; 226 | TIM3->CR1 |= 0x80; 227 | TIM3->CCMR1 |= 0x6800; 228 | TIM3->ARR = 2399; 229 | TIM3->PSC = 10; 230 | } 231 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_8){ 232 | 233 | RCC->APB2ENR |= (0x1<<11); 234 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 235 | GPIOA->CRH &= 0xFFFFFFF0; 236 | GPIOA->CRH |= 0xB; 237 | TIM1->CCER |= 0x1; 238 | TIM1->CR1 |= 0x80; 239 | TIM1->CCMR1 |= 0x68; 240 | TIM1->ARR = 2399; 241 | TIM1->PSC = 10; 242 | } 243 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_9){ 244 | 245 | RCC->APB2ENR |= (0x1<<11); 246 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 247 | GPIOA->CRH &= 0xFFFFFF0F; 248 | GPIOA->CRH |= (0xB<<4); 249 | TIM1->CCER |= 0x10; 250 | TIM1->CR1 |= 0x80; 251 | TIM1->CCMR1 |= 0x6800; 252 | TIM1->ARR = 2399; 253 | TIM1->PSC = 10; 254 | } 255 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_10){ 256 | 257 | RCC->APB2ENR |= (0x1<<11); 258 | RCC->APB2ENR |= 0x5; //GPIOA Enable. (If you use pwm, you should also enable alternate function mode. It has done in here.) 259 | GPIOA->CRH &= 0xFFFFF0FF; 260 | GPIOA->CRH |= (0xB<<8); 261 | TIM1->CCER |= 0x100; 262 | TIM1->CR1 |= 0x80; 263 | TIM1->CCMR2 |= 0x68; 264 | TIM1->ARR = 2399; 265 | TIM1->PSC = 10; 266 | } 267 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_11){ 268 | 269 | RCC->APB2ENR |= (0x1<<11); 270 | RCC->APB2ENR |= 0x5; 271 | GPIOA->CRH &= 0xFFFF0FFF; 272 | GPIOA->CRH |= (0xB<<12); 273 | TIM1->CCER |= 0x1000; 274 | TIM1->CR1 |= 0x80; 275 | TIM1->CCMR2 |= 0x6800; 276 | TIM1->ARR = 2399; 277 | TIM1->PSC = 10; 278 | } 279 | else if (Port_Pin.pwm_port == GPIOA && Port_Pin.pwm_pin == GPIO_Pin_15){ 280 | 281 | RCC->APB2ENR |= 0x5; 282 | RCC->APB1ENR |= 0x1; 283 | GPIOA->CRH &= 0x0FFFFFFF; 284 | GPIOA->CRH |= (0xB<<28); 285 | TIM2->CCER |= 0x1; 286 | TIM2->CR1 |= 0x80; 287 | TIM2->CCMR1 |= 0x68; 288 | TIM2->ARR = 2399; 289 | TIM2->PSC = 10; 290 | } 291 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_0){ 292 | 293 | RCC->APB1ENR |= (0x1<<1); 294 | RCC->APB2ENR |= 0x9; 295 | GPIOB->CRL &= 0xFFFFFFF0; 296 | GPIOB->CRL |= 0xB; 297 | TIM3->CCER |= 0x100; 298 | TIM3->CR1 |= 0x80; 299 | TIM3->CCMR2 |= 0x68; 300 | TIM3->ARR = 2399; 301 | TIM3->PSC = 10; 302 | } 303 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_1){ 304 | 305 | RCC->APB1ENR |= (0x1<<1); 306 | RCC->APB2ENR |= 0x9; 307 | GPIOB->CRL &= 0xFFFFFF0F; 308 | GPIOB->CRL |= (0xB<<4); 309 | TIM3->CCER |= 0x1000; 310 | TIM3->CR1 |= 0x80; 311 | TIM3->CCMR2 |= 0x6800; 312 | TIM2->ARR = 2399; 313 | TIM2->PSC = 10; 314 | } 315 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_3){ 316 | 317 | RCC->APB1ENR |= 0x1; 318 | RCC->APB2ENR |= 0x9; 319 | GPIOB->CRL &= 0xFFFF0FFF; 320 | GPIOB->CRL |= (0xB<<12); 321 | TIM2->CCER |= 0x10; 322 | TIM2->CR1 |= 0x80; 323 | TIM2->CCMR1 |= 0x6800; 324 | TIM2->ARR = 2399; 325 | TIM2->PSC = 10; 326 | } 327 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_4){ 328 | 329 | RCC->APB1ENR |= (0x1<<1); 330 | RCC->APB2ENR |= 0x9; 331 | GPIOB->CRL &= 0xFFF0FFFF; 332 | GPIOB->CRL |= (0xB<<16); 333 | TIM3->CCER |= 0x1; 334 | TIM3->CR1 |= 0x80; 335 | TIM3->CCMR1 |= 0x68; 336 | TIM3->ARR = 2399; 337 | TIM3->PSC = 10; 338 | } 339 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_5){ 340 | 341 | RCC->APB1ENR |= (0x1<<1); 342 | RCC->APB2ENR |= 0x9; 343 | GPIOB->CRL &= 0xFF0FFFFF; 344 | GPIOB->CRL |= (0xB<<20); 345 | TIM3->CCER |= 0x10; 346 | TIM3->CR1 |= 0x80; 347 | TIM3->CCMR1 |= 0x6800; 348 | TIM3->ARR = 2399; 349 | TIM3->PSC = 10; 350 | } 351 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_10){ 352 | 353 | RCC->APB1ENR |= 0x1; 354 | RCC->APB2ENR |= 0x9; 355 | GPIOB->CRH &= 0xFFFFF0FF; 356 | GPIOB->CRH |= (0xB<<8); 357 | TIM2->CCER |= 0x100; 358 | TIM2->CR1 |= 0x80; 359 | TIM2->CCMR2 |= 0x68; 360 | TIM2->ARR= 2399; 361 | TIM2->PSC = 10; 362 | } 363 | else if (Port_Pin.pwm_port == GPIOB && Port_Pin.pwm_pin == GPIO_Pin_11){ 364 | 365 | RCC->APB1ENR |= 0x1; 366 | RCC->APB2ENR |= 0x9; 367 | GPIOB->CRH &= 0xFFFF0FFF; 368 | GPIOB->CRH |= (0xB<<12); 369 | TIM2->CCER |= 0x1000; 370 | TIM2->CR1 |= 0x80; 371 | TIM2->CCMR2 |= 0x6800; 372 | TIM2->ARR = 2399; 373 | TIM2->PSC = 10; 374 | } 375 | 376 | // forward pin 377 | 378 | if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_0){ // direction settings for forward pin 379 | 380 | RCC->APB2ENR |= (0x1<<2); // GPIO settings 381 | GPIOA->CRL &= 0xFFFFFFF0; // Relevant bits have set to 0 382 | GPIOA->CRL |= (0x3) ; // Output mode and speed settings 383 | } 384 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_1){ 385 | 386 | RCC->APB2ENR |= (0x1<<2); 387 | GPIOA->CRL &= 0xFFFFFF0F; 388 | GPIOA->CRL |= (0x30); 389 | } 390 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_2){ 391 | 392 | RCC->APB2ENR |= (0x1<<2); 393 | GPIOA->CRL &= 0xFFFFF0FF; 394 | GPIOA->CRL |= (0x300) ; 395 | } 396 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_3){ 397 | 398 | RCC->APB2ENR |= (0x1<<2); 399 | GPIOA->CRL &= 0xFFFF0FFF; 400 | GPIOA->CRL |= (0x3000); 401 | } 402 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_4){ 403 | 404 | RCC->APB2ENR |= (0x1<<2); 405 | GPIOA->CRL &= 0xFFF0FFFF; 406 | GPIOA->CRL |= (0x30000); 407 | } 408 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_5){ 409 | 410 | RCC->APB2ENR |= (0x1<<2); 411 | GPIOA->CRL &= 0xFF0FFFFF; 412 | GPIOA->CRL |= (0x300000); 413 | } 414 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_6){ 415 | 416 | RCC->APB2ENR |= (0x1<<2); 417 | GPIOA->CRL &= 0xF0FFFFFF; 418 | GPIOA->CRL |= (0x3000000); 419 | } 420 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_7){ 421 | 422 | RCC->APB2ENR |= (0x1<<2); 423 | GPIOA->CRL &= 0x0FFFFFFF; 424 | GPIOA->CRL |= (0x30000000); 425 | } 426 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_8){ 427 | 428 | RCC->APB2ENR |= (0x1<<2); 429 | GPIOA->CRH &= 0xFFFFFFF0; 430 | GPIOA->CRH |= (0x3); 431 | } 432 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_9){ 433 | 434 | RCC->APB2ENR |= (0x1<<2); 435 | GPIOA->CRH &= 0xFFFFFF0F; 436 | GPIOA->CRH |= (0x30); 437 | } 438 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_10){ 439 | 440 | RCC->APB2ENR |= (0x1<<2); 441 | GPIOA->CRH &= 0xFFFFF0FF; 442 | GPIOA->CRH |= (0x300); 443 | } 444 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_11){ 445 | 446 | RCC->APB2ENR |= (0x1<<2); 447 | GPIOA->CRH &= 0xFFFF0FFF; 448 | GPIOA->CRH |= (0x3000); 449 | } 450 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_12){ 451 | 452 | RCC->APB2ENR |= (0x1<<2); 453 | GPIOA->CRH &= 0xFFF0FFFF; 454 | GPIOA->CRH |= (0x30000); 455 | } 456 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_13){ 457 | 458 | RCC->APB2ENR |= (0x1<<2); 459 | GPIOA->CRH &= 0xFF0FFFFF; 460 | GPIOA->CRH |= (0x300000); 461 | } 462 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_14){ 463 | 464 | RCC->APB2ENR |= (0x1<<2); 465 | GPIOA->CRH &= 0xF0FFFFFF; 466 | GPIOA->CRH |= (0x3000000); 467 | } 468 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_15){ 469 | 470 | RCC->APB2ENR |= (0x1<<2); 471 | GPIOA->CRH &= 0x0FFFFFFF; 472 | GPIOA->CRH |= (0x30000000); 473 | } 474 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_0){ 475 | 476 | RCC->APB2ENR |= (0x1<<3); 477 | GPIOB->CRL &= 0xFFFFFFF0; 478 | GPIOB->CRL |= (0x3) ; 479 | 480 | } 481 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_1){ 482 | 483 | RCC->APB2ENR |= (0x1<<3); 484 | GPIOB->CRL &= 0xFFFFFF0F; 485 | GPIOB->CRL |= (0x30); 486 | } 487 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_2){ 488 | 489 | RCC->APB2ENR |= (0x1<<3); 490 | GPIOB->CRL &= 0xFFFFF0FF; 491 | GPIOB->CRL |= (0x300); 492 | } 493 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_3){ 494 | 495 | RCC->APB2ENR |= (0x1<<3); 496 | GPIOB->CRL &= 0xFFFF0FFF; 497 | GPIOB->CRL |= (0x3000); 498 | } 499 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_4){ 500 | 501 | RCC->APB2ENR |= (0x1<<3); 502 | GPIOB->CRL &= 0xFFF0FFFF; 503 | GPIOB->CRL |= (0x30000); 504 | } 505 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_5){ 506 | 507 | RCC->APB2ENR |= (0x1<<3); 508 | GPIOB->CRL &= 0xFF0FFFFF; 509 | GPIOB->CRL |= (0x300000); 510 | } 511 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_6){ 512 | 513 | RCC->APB2ENR |= (0x1<<3); 514 | GPIOB->CRL &= 0xF0FFFFFF; 515 | GPIOB->CRL |= (0x3000000); 516 | } 517 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_7){ 518 | 519 | RCC->APB2ENR |= (0x1<<3); 520 | GPIOB->CRL &= 0x0FFFFFFF; 521 | GPIOB->CRL |= (0x30000000); 522 | } 523 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_8){ 524 | 525 | RCC->APB2ENR |= (0x1<<3); 526 | GPIOB->CRH &= 0xFFFFFFF0; 527 | GPIOB->CRH |= (0x3); 528 | } 529 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_9){ 530 | 531 | RCC->APB2ENR |= (0x1<<3); 532 | GPIOB->CRH &= 0xFFFFFF0F; 533 | GPIOB->CRH |= (0x30); 534 | } 535 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_10){ 536 | 537 | RCC->APB2ENR |= (0x1<<3); 538 | GPIOB->CRH &= 0xFFFFF0FF; 539 | GPIOB->CRH |= (0x300); 540 | } 541 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_11){ 542 | 543 | RCC->APB2ENR |= (0x1<<3); 544 | GPIOB->CRH &= 0xFFFF0FFF; 545 | GPIOB->CRH |= (0x3000); 546 | } 547 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_12){ 548 | 549 | RCC->APB2ENR |= (0x1<<3); 550 | GPIOB->CRH &= 0xFFF0FFFF; 551 | GPIOB->CRH |= (0x30000); 552 | } 553 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_13){ 554 | 555 | RCC->APB2ENR |= (0x1<<3); 556 | GPIOB->CRH &= 0xFF0FFFFF; 557 | GPIOB->CRH |= (0x300000); 558 | } 559 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_14){ 560 | 561 | RCC->APB2ENR |= (0x1<<3); 562 | GPIOB->CRH &= 0xF0FFFFFF; 563 | GPIOB->CRH |= (0x3000000); 564 | } 565 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_15){ 566 | 567 | RCC->APB2ENR |= (0x1<<3); 568 | GPIOB->CRH &= 0x0FFFFFFF; 569 | GPIOB->CRH |= (0x30000000); 570 | } 571 | 572 | // backward pin 573 | 574 | if(Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_0){ // direction settings for forward pin 575 | 576 | RCC->APB2ENR |= (0x1<<2); // GPIO settings 577 | GPIOA->CRL &= 0xFFFFFFF0; // Relevant bits have set to 0 578 | GPIOA->CRL |= (0x3); // Output mode and speed settings 579 | } 580 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_1){ 581 | 582 | RCC->APB2ENR |= (0x1<<2); 583 | GPIOA->CRL &= 0xFFFFFF0F; 584 | GPIOA->CRL |= (0x30); 585 | } 586 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_2){ 587 | 588 | RCC->APB2ENR |= (0x1<<2); 589 | GPIOA->CRL &= 0xFFFFF0FF; 590 | GPIOA->CRL |= (0x300); 591 | } 592 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_3){ 593 | 594 | RCC->APB2ENR |= (0x1<<2); 595 | GPIOA->CRL &= 0xFFFF0FFF; 596 | GPIOA->CRL |= (0x3000); 597 | } 598 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_4){ 599 | 600 | RCC->APB2ENR |= (0x1<<2); 601 | GPIOA->CRL &= 0xFFF0FFFF; 602 | GPIOA->CRL |= (0x30000); 603 | } 604 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_5){ 605 | 606 | RCC->APB2ENR |= (0x1<<2); 607 | GPIOA->CRL &= 0xFF0FFFFF; 608 | GPIOA->CRL |= (0x300000); 609 | } 610 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_6){ 611 | 612 | RCC->APB2ENR |= (0x1<<2); 613 | GPIOA->CRL &= 0xF0FFFFFF; 614 | GPIOA->CRL |= (0x3000000); 615 | } 616 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_7){ 617 | 618 | RCC->APB2ENR |= (0x1<<2); 619 | GPIOA->CRL &= 0x0FFFFFFF; 620 | GPIOA->CRL |= (0x30000000); 621 | } 622 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_8){ 623 | 624 | RCC->APB2ENR |= (0x1<<2); 625 | GPIOA->CRH &= 0xFFFFFFF0; 626 | GPIOA->CRH |= (0x3); 627 | } 628 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_9){ 629 | 630 | RCC->APB2ENR |= (0x1<<2); 631 | GPIOA->CRH &= 0xFFFFFF0F; 632 | GPIOA->CRH |= (0x30); 633 | } 634 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_10){ 635 | 636 | RCC->APB2ENR |= (0x1<<2); 637 | GPIOA->CRH &= 0xFFFFF0FF; 638 | GPIOA->CRH |= (0x300); 639 | } 640 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_11){ 641 | 642 | RCC->APB2ENR |= (0x1<<2); 643 | GPIOA->CRH &= 0xFFFF0FFF; 644 | GPIOA->CRH |= (0x3000); 645 | } 646 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_12){ 647 | 648 | RCC->APB2ENR |= (0x1<<2); 649 | GPIOA->CRH &= 0xFFF0FFFF; 650 | GPIOA->CRH |= (0x30000); 651 | } 652 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_13){ 653 | 654 | RCC->APB2ENR |= (0x1<<2); 655 | GPIOA->CRH &= 0xFF0FFFFF; 656 | GPIOA->CRH |= (0x300000); 657 | } 658 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_14){ 659 | 660 | RCC->APB2ENR |= (0x1<<2); 661 | GPIOA->CRH &= 0xF0FFFFFF; 662 | GPIOA->CRH |= (0x3000000); 663 | } 664 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_15){ 665 | 666 | RCC->APB2ENR |= (0x1<<2); 667 | GPIOA->CRH &= 0x0FFFFFFF; 668 | GPIOA->CRH |= (0x30000000); 669 | } 670 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_0){ 671 | 672 | RCC->APB2ENR |= (0x1<<3); 673 | GPIOB->CRL &= 0xFFFFFFF0; 674 | GPIOB->CRL |= (0x3); 675 | } 676 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_1){ 677 | 678 | RCC->APB2ENR |= (0x1<<3); 679 | GPIOB->CRL &= 0xFFFFFF0F; 680 | GPIOB->CRL |= (0x30); 681 | } 682 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_2){ 683 | 684 | RCC->APB2ENR |= (0x1<<3); 685 | GPIOB->CRL &= 0xFFFFF0FF; 686 | GPIOB->CRL |= (0x300); 687 | } 688 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_3){ 689 | 690 | RCC->APB2ENR |= (0x1<<3); 691 | GPIOB->CRL &= 0xFFFF0FFF; 692 | GPIOB->CRL |= (0x3000); 693 | } 694 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_4){ 695 | 696 | RCC->APB2ENR |= (0x1<<3); 697 | GPIOB->CRL &= 0xFFF0FFFF; 698 | GPIOB->CRL |= (0x30000); 699 | } 700 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_5){ 701 | 702 | RCC->APB2ENR |= (0x1<<3); 703 | GPIOB->CRL &= 0xFF0FFFFF; 704 | GPIOB->CRL |= (0x300000); 705 | } 706 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_6){ 707 | 708 | RCC->APB2ENR |= (0x1<<3); 709 | GPIOB->CRL &= 0xF0FFFFFF; 710 | GPIOB->CRL |= (0x3000000); 711 | } 712 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_7){ 713 | 714 | RCC->APB2ENR |= (0x1<<3); 715 | GPIOB->CRL &= 0x0FFFFFFF; 716 | GPIOB->CRL |= (0x3000000); 717 | } 718 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_8){ 719 | 720 | RCC->APB2ENR |= (0x1<<3); 721 | GPIOB->CRH &= 0xFFFFFFF0; 722 | GPIOB->CRH |= (0x3); 723 | } 724 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_9){ 725 | 726 | RCC->APB2ENR |= (0x1<<3); 727 | GPIOB->CRH &= 0xFFFFFF0F; 728 | GPIOB->CRH |= (0x30); 729 | } 730 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_10){ 731 | 732 | RCC->APB2ENR |= (0x1<<3); 733 | GPIOB->CRH &= 0xFFFFF0FF; 734 | GPIOB->CRH |= (0x300); 735 | } 736 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_11){ 737 | 738 | RCC->APB2ENR |= (0x1<<3); 739 | GPIOB->CRH &= 0xFFFF0FFF; 740 | GPIOB->CRH |= (0x3000); 741 | } 742 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_12){ 743 | 744 | RCC->APB2ENR |= (0x1<<3); 745 | GPIOB->CRH &= 0xFFF0FFFF; 746 | GPIOB->CRH |= (0x30000); 747 | } 748 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_13){ 749 | 750 | RCC->APB2ENR |= (0x1<<3); 751 | GPIOB->CRH &= 0xFF0FFFFF; 752 | GPIOB->CRH |= (0x300000); 753 | } 754 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_14){ 755 | 756 | RCC->APB2ENR |= (0x1<<3); 757 | GPIOB->CRH &= 0xF0FFFFFF; 758 | GPIOB->CRH |= (0x3000000); 759 | } 760 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_15){ 761 | 762 | RCC->APB2ENR |= (0x1<<3); 763 | GPIOB->CRH &= 0x0FFFFFFF; 764 | GPIOB->CRH |= (0x30000000); 765 | } 766 | } 767 | void Basic_MotorConfig(Motor Port_Pin){ // DC Motor configuration without pwm settings 768 | 769 | // forward port_pin 770 | 771 | if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_0){ 772 | 773 | RCC->APB2ENR |= (0x1<<2); // Relevant bits have set to 0 774 | GPIOA->CRL &= 0xFFFFFFF0; // GPIO settings 775 | GPIOA->CRL |= (0x3); // Output mode and speed settings 776 | } 777 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_1){ 778 | 779 | RCC->APB2ENR |= (0x1<<2); 780 | GPIOA->CRL &= 0xFFFFFF0F; 781 | GPIOA->CRL |= (0x30) ; 782 | } 783 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_2){ 784 | 785 | RCC->APB2ENR |= (0x1<<2); 786 | GPIOA->CRL &= 0xFFFFF0FF; 787 | GPIOA->CRL |= (0x300) ; 788 | } 789 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_3){ 790 | 791 | RCC->APB2ENR |= (0x1<<2); 792 | GPIOA->CRL &= 0xFFFF0FFF; 793 | GPIOA->CRL |= (0x3000); 794 | } 795 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_6){ 796 | 797 | RCC->APB2ENR |= (0x1<<2); 798 | GPIOA->CRL &= 0xF0FFFFFF; 799 | GPIOA->CRL |= (0x3000000); 800 | } 801 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_7){ 802 | 803 | RCC->APB2ENR |= (0x1<<2); 804 | GPIOA->CRL &= 0x0FFFFFFF; 805 | GPIOA->CRL |= (0x30000000); 806 | } 807 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_8){ 808 | 809 | RCC->APB2ENR |= (0x1<<2); 810 | GPIOA->CRH &= 0xFFFFFFF0; 811 | GPIOA->CRH |= (0x3); 812 | } 813 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_9){ 814 | 815 | RCC->APB2ENR |= (0x1<<2); 816 | GPIOA->CRH &= 0xFFFFFF0F; 817 | GPIOA->CRH |= (0x30); 818 | } 819 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_10){ 820 | 821 | RCC->APB2ENR |= (0x1<<2); 822 | GPIOA->CRH &= 0xFFFFF0FF; 823 | GPIOA->CRH |= (0x300); 824 | } 825 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_11){ 826 | 827 | RCC->APB2ENR |= (0x1<<2); 828 | GPIOA->CRH &= 0xFFFF0FFF; 829 | GPIOA->CRH |= (0x3000); 830 | } 831 | else if (Port_Pin.forward_port == GPIOA && Port_Pin.forward_pin == GPIO_Pin_15){ 832 | 833 | RCC->APB2ENR |= (0x1<<2); 834 | GPIOA->CRH &= 0x0FFFFFFF; 835 | GPIOA->CRH |= (0x30000000); 836 | } 837 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_0){ 838 | 839 | RCC->APB2ENR |= (0x1<<3); 840 | GPIOB->CRL &= 0xFFFFFFF0; 841 | GPIOA->CRL |= (0x3) ; 842 | } 843 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_1){ 844 | 845 | RCC->APB2ENR |= (0x1<<3); 846 | GPIOB->CRL &= 0xFFFFFF0F; 847 | GPIOA->CRL |= (0x30) ; 848 | } 849 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_3){ 850 | 851 | RCC->APB2ENR |= (0x1<<3); 852 | GPIOB->CRL &= 0xFFFF0FFF; 853 | GPIOA->CRL |= (0x3000) ; 854 | } 855 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_4){ 856 | 857 | RCC->APB2ENR |= (0x1<<3); 858 | GPIOB->CRL &= 0xFFF0FFFF; 859 | GPIOA->CRL |= (0x30000) ; 860 | } 861 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_5){ 862 | 863 | RCC->APB2ENR |= (0x1<<3); 864 | GPIOB->CRL &= 0xFF0FFFFF; 865 | GPIOA->CRL |= (0x300000); 866 | } 867 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_10){ 868 | 869 | RCC->APB2ENR |= (0x1<<3); 870 | GPIOB->CRH &= 0xFFFFF0FF; 871 | GPIOB->CRH |= (0x300); 872 | } 873 | else if (Port_Pin.forward_port == GPIOB && Port_Pin.forward_pin == GPIO_Pin_11){ 874 | 875 | RCC->APB2ENR |= (0x1<<3); 876 | GPIOB->CRH &= 0xFFFF0FFF; 877 | GPIOB->CRH |= (0x3000); 878 | } 879 | 880 | // backward port_pin 881 | 882 | if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_0){ 883 | 884 | RCC->APB2ENR |= (0x1<<2); // GPIO settings 885 | GPIOA->CRL &= 0xFFFFFFF0; // Relevant bits have set to 0 886 | GPIOA->CRL |= (0x3); // Output mode and speed settings 887 | } 888 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_1){ 889 | 890 | RCC->APB2ENR |= (0x1<<2); 891 | GPIOA->CRL &= 0xFFFFFF0F; 892 | GPIOA->CRL |= (0x30); 893 | } 894 | 895 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_2){ 896 | 897 | RCC->APB2ENR |= (0x1<<2); 898 | GPIOA->CRL &= 0xFFFFF0FF; 899 | GPIOA->CRL |= (0x300) ; 900 | } 901 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_3){ 902 | 903 | RCC->APB2ENR |= (0x1<<2); 904 | GPIOA->CRL &= 0xFFFF0FFF; 905 | GPIOA->CRL |= (0x3000); 906 | 907 | } 908 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_6){ 909 | 910 | RCC->APB2ENR |= (0x1<<2); 911 | GPIOA->CRL &= 0xF0FFFFFF; 912 | GPIOA->CRL |= (0x3000000); 913 | } 914 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_7){ 915 | 916 | RCC->APB2ENR |= (0x1<<2); 917 | GPIOA->CRL &= 0x0FFFFFFF; 918 | GPIOA->CRL |= (0x30000000); 919 | } 920 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_8){ 921 | 922 | RCC->APB2ENR |= (0x1<<2); 923 | GPIOA->CRH &= 0xFFFFFFF0; 924 | GPIOA->CRH |= (0x3); 925 | } 926 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_9){ 927 | 928 | RCC->APB2ENR |= (0x1<<2); 929 | GPIOA->CRH &= 0xFFFFFF0F; 930 | GPIOA->CRH |= (0x30); 931 | } 932 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_10){ 933 | 934 | RCC->APB2ENR |= (0x1<<2); 935 | GPIOA->CRH &= 0xFFFFF0FF; 936 | GPIOA->CRH |= (0x300); 937 | } 938 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_11){ 939 | 940 | RCC->APB2ENR |= (0x1<<2); 941 | GPIOA->CRH &= 0xFFFF0FFF; 942 | GPIOA->CRH |= (0x3000); 943 | } 944 | else if (Port_Pin.backward_port == GPIOA && Port_Pin.backward_pin == GPIO_Pin_15){ 945 | 946 | RCC->APB2ENR |= (0x1<<2); 947 | GPIOA->CRH &= 0x0FFFFFFF; 948 | GPIOA->CRH |= (0x30000000); 949 | } 950 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_0){ 951 | 952 | RCC->APB2ENR |= (0x1<<3); 953 | GPIOB->CRL &= 0xFFFFFFF0; 954 | GPIOA->CRL |= (0x3) ; 955 | } 956 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_1){ 957 | 958 | RCC->APB2ENR |= (0x1<<3); 959 | GPIOB->CRL &= 0xFFFFFF0F; 960 | GPIOA->CRL |= (0x30) ; 961 | } 962 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_3){ 963 | 964 | RCC->APB2ENR |= (0x1<<3); 965 | GPIOB->CRL &= 0xFFFF0FFF; 966 | GPIOA->CRL |= (0x3000) ; 967 | } 968 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_4){ 969 | 970 | RCC->APB2ENR |= (0x1<<3); 971 | GPIOB->CRL &= 0xFFF0FFFF; 972 | GPIOA->CRL |= (0x30000) ; 973 | } 974 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_5){ 975 | 976 | RCC->APB2ENR |= (0x1<<3); 977 | GPIOB->CRL &= 0xFF0FFFFF; 978 | GPIOA->CRL |= (0x300000); 979 | } 980 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_10){ 981 | 982 | RCC->APB2ENR |= (0x1<<3); 983 | GPIOB->CRH &= 0xFFFFF0FF; 984 | GPIOB->CRH |= (0x300); 985 | } 986 | else if (Port_Pin.backward_port == GPIOB && Port_Pin.backward_pin == GPIO_Pin_11){ 987 | 988 | RCC->APB2ENR |= (0x1<<3); 989 | GPIOB->CRH &= 0xFFFF0FFF; 990 | GPIOB->CRH |= (0x3000); 991 | } 992 | } 993 | 994 | void Basic_MotorRun(Motor Port_Pin,char direction){ // Running function without pwm, just for full speed of backward or forward 995 | 996 | // motor direction 997 | if(direction=='f'){ 998 | 999 | Port_Pin.forward_port->BSRR = Port_Pin.forward_pin; // high voltage for forward pin 1000 | Port_Pin.backward_port->BRR = Port_Pin.backward_pin; // low voltage for backward pin 1001 | } 1002 | else if(direction=='b'){ 1003 | 1004 | Port_Pin.backward_port->BSRR = Port_Pin.backward_pin; // high voltage for backward pin 1005 | Port_Pin.forward_port->BRR = Port_Pin.forward_pin; // low voltage for forward pin 1006 | } 1007 | } 1008 | void Motor_Stop(Motor Port_Pin){ // Stop function for selected motor 1009 | 1010 | Port_Pin.forward_port->BRR = Port_Pin.forward_pin; // low voltage for backward pin 1011 | Port_Pin.backward_port->BRR = Port_Pin.backward_pin; // low voltage for forward pin 1012 | } 1013 | -------------------------------------------------------------------------------- /Liek DC Motor Library v2.4/dc_motor_library.h: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | @author: LIEK TEAM 3 | @version: 2.4 4 | @date: 01.05.2021 5 | -PWM pins for speed control: A0,A1,...,A7 and B0. Other pwm pins does not work. 6 | -Digital pins for direction: All GPIO pins except A15, B3, B4. 7 | ************************************************************/ 8 | #ifndef dc_motor_library 9 | #define dc_motor_library 10 | #include "stm32f10x.h" // Device header 11 | 12 | typedef struct MotorStruct{ // DC Motor structure 13 | 14 | GPIO_TypeDef* pwm_port; // Port and pin assignments for pwm 15 | uint16_t pwm_pin; // If pwm not used, pwm_port and pwm_pin assignments are unnecessary 16 | 17 | GPIO_TypeDef* forward_port; // Port and pin assignments for forward direction 18 | uint16_t forward_pin; 19 | 20 | GPIO_TypeDef* backward_port; // Port and pin assignments for backward direction 21 | uint16_t backward_pin; 22 | 23 | }Motor; 24 | 25 | void MotorConfig(Motor Port_Pin); // DC Motor configuration including pwm settings 26 | void MotorRun(Motor Port_Pin, uint16_t speed, char direction); // Running function with pwm 27 | void Basic_MotorConfig(Motor Port_Pin); // DC Motor configuration without pwm settings 28 | void Basic_MotorRun(Motor Port_Pin,char direction); // Running function without pwm, just for full speed of backward or forward 29 | void Motor_Stop(Motor Port_Pin); // Stop function for selected motor 30 | void Motor_Delay(uint32_t time); // Real time delay function 31 | void systemClockEnable(void); 32 | void SysTick_Handler(void); 33 | #endif 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Liek-DC-Motor-Library-STM32F10x 2 | DC motor library for STM32F10x microcontrollers. It can be used with L298N motor driver. 3 | 4 | ->PWM pins for speed control: A0,A1,...,A7 and B0. Other pwm pins does not work. 5 | ->Digital pins for direction: All GPIO pins except A15, B3, B4. 6 | -------------------------------------------------------------------------------- /dcmotor_lib.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liek-Software-Team/Liek-DC-Motor-Library-STM32F10x/d05f111560969b58771a5b6e4d12175a7d65867c/dcmotor_lib.pdf --------------------------------------------------------------------------------