wip
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@@ -26,7 +26,7 @@ endif
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
C_SOURCES := $(foreach folder, $(SRC_DIR), $(wildcard $(folder)/*.c))
 | 
					C_SOURCES := $(foreach folder, $(SRC_DIR), $(wildcard $(folder)/*.c))
 | 
				
			||||||
C_OBJECTS := $(C_SOURCES:%.c=$(OBJ_DIR)/%.o)
 | 
					C_OBJECTS := $(C_SOURCES:%.c=$(OBJ_DIR)/%.o)
 | 
				
			||||||
C_DEPS := $(SOURCES:%.c=$(OBJ_DIR)/%.d)
 | 
					C_DEPS := $(C_SOURCES:%.c=$(OBJ_DIR)/%.d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: $(MAIN_FILE)
 | 
					all: $(MAIN_FILE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,7 +57,8 @@ C_FLAGS += \
 | 
				
			|||||||
	-Wno-unused-parameter \
 | 
						-Wno-unused-parameter \
 | 
				
			||||||
	-Wno-sign-compare \
 | 
						-Wno-sign-compare \
 | 
				
			||||||
	-Wno-missing-prototypes \
 | 
						-Wno-missing-prototypes \
 | 
				
			||||||
	-Wno-missing-declarations
 | 
						-Wno-missing-declarations \
 | 
				
			||||||
 | 
						-Wno-missing-field-initializers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
L_FLAGS := \
 | 
					L_FLAGS := \
 | 
				
			||||||
	-T mem.ld \
 | 
						-T mem.ld \
 | 
				
			||||||
@@ -66,7 +67,8 @@ L_FLAGS := \
 | 
				
			|||||||
	-nostartfiles \
 | 
						-nostartfiles \
 | 
				
			||||||
	-Xlinker --gc-sections \
 | 
						-Xlinker --gc-sections \
 | 
				
			||||||
	-L"config/linker" \
 | 
						-L"config/linker" \
 | 
				
			||||||
	--specs=nano.specs
 | 
						--specs=nano.specs \
 | 
				
			||||||
 | 
						-u _printf_float
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(DEBUG),y)
 | 
					ifeq ($(DEBUG),y)
 | 
				
			||||||
OPTIM = g
 | 
					OPTIM = g
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,8 +8,8 @@
 | 
				
			|||||||
#ifndef ISR_H_
 | 
					#ifndef ISR_H_
 | 
				
			||||||
#define ISR_H_
 | 
					#define ISR_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ARCH_MSP430
 | 
					#ifdef ARCH_STM32F4XX
 | 
				
			||||||
#include "msp430_isr.h"
 | 
					#include "stm32f4xx_isr.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ISR_H_ */
 | 
					#endif /* ISR_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,8 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "driver.h"
 | 
					#include "driver.h"
 | 
				
			||||||
#include "board.h"
 | 
					#include "board.h"
 | 
				
			||||||
@@ -16,8 +18,79 @@
 | 
				
			|||||||
#include "list.h"
 | 
					#include "list.h"
 | 
				
			||||||
#include "shell.h"
 | 
					#include "shell.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static TIM_HandleTypeDef timer_handle = {
 | 
				
			||||||
 | 
							.Instance = TIM2,
 | 
				
			||||||
 | 
							.Init.Prescaler = 1000,
 | 
				
			||||||
 | 
							.Init.CounterMode = TIM_COUNTERMODE_UP,
 | 
				
			||||||
 | 
							.Init.Period = 0xffff,
 | 
				
			||||||
 | 
							.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1,
 | 
				
			||||||
 | 
							.Init.RepetitionCounter = 0,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static TIM_IC_InitTypeDef input_capture_init = {
 | 
				
			||||||
 | 
							.ICPrescaler = TIM_ICPSC_DIV1,
 | 
				
			||||||
 | 
							.ICFilter = 0,
 | 
				
			||||||
 | 
							.ICPolarity = TIM_ICPOLARITY_FALLING,
 | 
				
			||||||
 | 
							.ICSelection = TIM_ICSELECTION_INDIRECTTI,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static TIM_SlaveConfigTypeDef   slave_config = {
 | 
				
			||||||
 | 
							.SlaveMode = TIM_SLAVEMODE_RESET,
 | 
				
			||||||
 | 
							.InputTrigger = TIM_TS_TI1FP1,
 | 
				
			||||||
 | 
							.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE,
 | 
				
			||||||
 | 
							.TriggerFilter = 0,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static GPIO_InitTypeDef port_cfg_b10 = {
 | 
				
			||||||
 | 
							.Pin = GPIO_PIN_10,
 | 
				
			||||||
 | 
							.Mode = GPIO_MODE_AF_OD,
 | 
				
			||||||
 | 
							.Speed = GPIO_SPEED_FREQ_HIGH,
 | 
				
			||||||
 | 
							.Pull = GPIO_NOPULL,
 | 
				
			||||||
 | 
							.Alternate = GPIO_AF1_TIM2,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct stm32f4_gpio b10_gpio = {
 | 
				
			||||||
 | 
							.port = GPIOB,
 | 
				
			||||||
 | 
							.pin = &port_cfg_b10,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct gpio __gpio_b10 = {
 | 
				
			||||||
 | 
							(void*)&b10_gpio,
 | 
				
			||||||
 | 
							&gpio_fp
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct driver gpio_b10 = {
 | 
				
			||||||
 | 
							DRIVER_TYPE_GPIO,
 | 
				
			||||||
 | 
							&__gpio_b10,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t ch3 = 0, ch4 = 0;
 | 
				
			||||||
 | 
					static int period = 0, pulse = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void config_input(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__HAL_RCC_TIM2_CLK_ENABLE();
 | 
				
			||||||
 | 
						drv_open(&gpio_b10);
 | 
				
			||||||
 | 
						HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* cfg timer */
 | 
				
			||||||
 | 
						HAL_TIM_IC_Init(&timer_handle);
 | 
				
			||||||
 | 
						HAL_TIM_IC_ConfigChannel(&timer_handle, &input_capture_init, TIM_CHANNEL_4);
 | 
				
			||||||
 | 
						input_capture_init.ICPolarity = TIM_ICPOLARITY_RISING;
 | 
				
			||||||
 | 
						input_capture_init.ICSelection = TIM_ICSELECTION_DIRECTTI;
 | 
				
			||||||
 | 
						HAL_TIM_IC_ConfigChannel(&timer_handle, &input_capture_init, TIM_CHANNEL_3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HAL_TIM_SlaveConfigSynchronization(&timer_handle, &slave_config);
 | 
				
			||||||
 | 
						HAL_TIM_IC_Start_IT(&timer_handle, TIM_CHANNEL_4);
 | 
				
			||||||
 | 
						HAL_TIM_IC_Start_IT(&timer_handle, TIM_CHANNEL_3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HAL_NVIC_EnableIRQ(TIM2_IRQn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void)
 | 
					int main(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						char print_buffer[80];
 | 
				
			||||||
	drv_open(&pwm_1);
 | 
						drv_open(&pwm_1);
 | 
				
			||||||
	drv_open(&pwm_2);
 | 
						drv_open(&pwm_2);
 | 
				
			||||||
	drv_open(&pwm_3);
 | 
						drv_open(&pwm_3);
 | 
				
			||||||
@@ -25,22 +98,104 @@ int main(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	drv_open(&pwm5_c2);
 | 
						drv_open(&pwm5_c2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						drv_open(&uart_1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config_input();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while(1) {
 | 
						while(1) {
 | 
				
			||||||
		for(unsigned int duty = 0; duty < 100; duty++) {
 | 
							for(unsigned int duty = 0; duty < 100; duty++) {
 | 
				
			||||||
			drv_ioctl(&pwm_1, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_1, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			drv_ioctl(&pwm_2, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_2, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			drv_ioctl(&pwm_3, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_3, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			drv_ioctl(&pwm_4, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_4, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			sleep_ms(10);
 | 
								sleep_ms(100);
 | 
				
			||||||
 | 
								if((period >= 0) && (pulse >= 0)) {
 | 
				
			||||||
 | 
					//				sprintf(print_buffer, "period: %u,\tpulse: %u\r\n", period, pulse);
 | 
				
			||||||
 | 
					//				drv_write(&uart_1, print_buffer, strlen(print_buffer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									float dist = 84000.0 / pulse;
 | 
				
			||||||
 | 
									dist = 343.0 / dist;
 | 
				
			||||||
 | 
									dist /= 2.0;
 | 
				
			||||||
 | 
									dist *= 100; // m -> cm
 | 
				
			||||||
 | 
									int d = (int)dist;
 | 
				
			||||||
 | 
									sprintf(print_buffer, "distance: %d cm\r\n", d);
 | 
				
			||||||
 | 
									drv_write(&uart_1, print_buffer, strlen(print_buffer));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for(unsigned int duty = 98; duty > 0; duty--) {
 | 
							for(unsigned int duty = 98; duty > 0; duty--) {
 | 
				
			||||||
			drv_ioctl(&pwm_1, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_1, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			drv_ioctl(&pwm_2, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_2, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			drv_ioctl(&pwm_3, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_3, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			drv_ioctl(&pwm_4, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
								drv_ioctl(&pwm_4, IOCTL_PWM_SET_DUTY_CYCLE, (const void *)&duty);
 | 
				
			||||||
			sleep_ms(10);
 | 
								sleep_ms(100);
 | 
				
			||||||
 | 
								if((period >= 0) && (pulse >= 0)) {
 | 
				
			||||||
 | 
					//				sprintf(print_buffer, "period: %u,\tpulse: %u\r\n", period, pulse);
 | 
				
			||||||
 | 
					//				drv_write(&uart_1, print_buffer, strlen(print_buffer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									float dist = 84000.0 / pulse;
 | 
				
			||||||
 | 
									dist = 343.0 / dist;
 | 
				
			||||||
 | 
									dist /= 2.0;
 | 
				
			||||||
 | 
									dist *= 100; // m -> cm
 | 
				
			||||||
 | 
									int d = (int)dist;
 | 
				
			||||||
 | 
									sprintf(print_buffer, "distance: %d cm\r\n", d);
 | 
				
			||||||
 | 
									drv_write(&uart_1, print_buffer, strlen(print_buffer));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "isr.h"
 | 
				
			||||||
 | 
					void TIM2_IRQHandler(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						enter_isr();
 | 
				
			||||||
 | 
						TIM_HandleTypeDef *htim = &timer_handle;
 | 
				
			||||||
 | 
						uint32_t tmpreg = 0U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) {
 | 
				
			||||||
 | 
							if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) !=RESET) {
 | 
				
			||||||
 | 
								__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
 | 
				
			||||||
 | 
								/* Input capture event */
 | 
				
			||||||
 | 
								if((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) {
 | 
				
			||||||
 | 
									tmpreg = htim->Instance->CCR1;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* Capture compare 2 event */
 | 
				
			||||||
 | 
						if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) {
 | 
				
			||||||
 | 
							if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) !=RESET) {
 | 
				
			||||||
 | 
								__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);
 | 
				
			||||||
 | 
								/* Input capture event */
 | 
				
			||||||
 | 
								if((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) {
 | 
				
			||||||
 | 
									tmpreg = htim->Instance->CCR2;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* Capture compare 3 event */
 | 
				
			||||||
 | 
						if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) {
 | 
				
			||||||
 | 
							if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) !=RESET) {
 | 
				
			||||||
 | 
								__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3);
 | 
				
			||||||
 | 
								/* Input capture event */
 | 
				
			||||||
 | 
								if((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) {
 | 
				
			||||||
 | 
									ch3 = htim->Instance->CCR3;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* Capture compare 4 event */
 | 
				
			||||||
 | 
						if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) {
 | 
				
			||||||
 | 
							if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) !=RESET) {
 | 
				
			||||||
 | 
								__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4);
 | 
				
			||||||
 | 
								/* Input capture event */
 | 
				
			||||||
 | 
								if((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) {
 | 
				
			||||||
 | 
									uint32_t ch4_old = ch4;
 | 
				
			||||||
 | 
									ch4 = htim->Instance->CCR4;
 | 
				
			||||||
 | 
									period = ch4 - ch4_old;
 | 
				
			||||||
 | 
									pulse = ch4 - ch3;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						tmpreg = tmpreg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exit_isr();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user