mirror of
https://github.com/eddyem/stm32samples.git
synced 2025-12-06 02:35:23 +03:00
add Jeep_generator
This commit is contained in:
parent
a7f16d107a
commit
bdcc9d7b01
133
Jeep_generator/Makefile
Normal file
133
Jeep_generator/Makefile
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
BINARY = jeep_generator
|
||||||
|
BOOTPORT ?= /dev/ttyUSB0
|
||||||
|
BOOTSPEED ?= 115200
|
||||||
|
# change this linking script depending on particular MCU model,
|
||||||
|
# for example, if you have STM32F103VBT6, you should write:
|
||||||
|
LDSCRIPT = ld/stm32f103xB.ld
|
||||||
|
LIBNAME = opencm3_stm32f1
|
||||||
|
DEFS = -DSTM32F1 -DEBUG
|
||||||
|
|
||||||
|
OBJDIR = mk
|
||||||
|
INDEPENDENT_HEADERS=
|
||||||
|
|
||||||
|
FP_FLAGS ?= -msoft-float
|
||||||
|
ARCH_FLAGS = -mthumb -mcpu=cortex-m3 $(FP_FLAGS) -mfix-cortex-m3-ldrd
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Executables
|
||||||
|
PREFIX ?= arm-none-eabi
|
||||||
|
|
||||||
|
RM := rm -f
|
||||||
|
RMDIR := rmdir
|
||||||
|
CC := $(PREFIX)-gcc
|
||||||
|
LD := $(PREFIX)-gcc
|
||||||
|
AR := $(PREFIX)-ar
|
||||||
|
AS := $(PREFIX)-as
|
||||||
|
OBJCOPY := $(PREFIX)-objcopy
|
||||||
|
OBJDUMP := $(PREFIX)-objdump
|
||||||
|
GDB := $(PREFIX)-gdb
|
||||||
|
STFLASH = $(shell which st-flash)
|
||||||
|
STBOOT = $(shell which stm32flash)
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Source files
|
||||||
|
LDSCRIPT ?= $(BINARY).ld
|
||||||
|
SRC = $(wildcard *.c)
|
||||||
|
OBJS = $(addprefix $(OBJDIR)/, $(SRC:%.c=%.o))
|
||||||
|
|
||||||
|
ifeq ($(strip $(OPENCM3_DIR)),)
|
||||||
|
OPENCM3_DIR := /usr/local/arm-none-eabi
|
||||||
|
$(info Using $(OPENCM3_DIR) path to library)
|
||||||
|
endif
|
||||||
|
|
||||||
|
INCLUDE_DIR = $(OPENCM3_DIR)/include
|
||||||
|
LIB_DIR = $(OPENCM3_DIR)/lib
|
||||||
|
SCRIPT_DIR = $(OPENCM3_DIR)/scripts
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# C flags
|
||||||
|
CFLAGS += -Os -g
|
||||||
|
CFLAGS += -Wall -Wextra -Wshadow -Wimplicit-function-declaration
|
||||||
|
CFLAGS += -Wredundant-decls
|
||||||
|
# -Wmissing-prototypes -Wstrict-prototypes
|
||||||
|
CFLAGS += -fno-common -ffunction-sections -fdata-sections
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# C & C++ preprocessor common flags
|
||||||
|
CPPFLAGS += -MD
|
||||||
|
CPPFLAGS += -Wall -Werror
|
||||||
|
CPPFLAGS += -I$(INCLUDE_DIR) $(DEFS)
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Linker flags
|
||||||
|
LDFLAGS += --static -nostartfiles
|
||||||
|
LDFLAGS += -L$(LIB_DIR)
|
||||||
|
LDFLAGS += -T$(LDSCRIPT)
|
||||||
|
LDFLAGS += -Wl,-Map=$(*).map
|
||||||
|
LDFLAGS += -Wl,--gc-sections
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Used libraries
|
||||||
|
LDLIBS += -l$(LIBNAME)
|
||||||
|
LDLIBS += -Wl,--start-group -lc -lgcc -Wl,--end-group
|
||||||
|
|
||||||
|
.SUFFIXES: .elf .bin .hex .srec .list .map .images
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
.SECONDARY:
|
||||||
|
|
||||||
|
ELF := $(OBJDIR)/$(BINARY).elf
|
||||||
|
LIST := $(OBJDIR)/$(BINARY).list
|
||||||
|
BIN := $(BINARY).bin
|
||||||
|
HEX := $(BINARY).hex
|
||||||
|
|
||||||
|
all: bin
|
||||||
|
|
||||||
|
elf: $(ELF)
|
||||||
|
bin: $(BIN)
|
||||||
|
hex: $(HEX)
|
||||||
|
list: $(LIST)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.c
|
||||||
|
@printf " CC $<\n"
|
||||||
|
$(CC) $(CFLAGS) $(CPPFLAGS) $(ARCH_FLAGS) -o $@ -c $<
|
||||||
|
|
||||||
|
$(SRC) : %.c : %.h $(INDEPENDENT_HEADERS)
|
||||||
|
@touch $@
|
||||||
|
|
||||||
|
%.h: ;
|
||||||
|
|
||||||
|
$(BIN): $(ELF)
|
||||||
|
@printf " OBJCOPY $(BIN)\n"
|
||||||
|
$(OBJCOPY) -Obinary $(ELF) $(BIN)
|
||||||
|
|
||||||
|
$(HEX): $(ELF)
|
||||||
|
@printf " OBJCOPY $(HEX)\n"
|
||||||
|
$(OBJCOPY) -Oihex $(ELF) $(HEX)
|
||||||
|
|
||||||
|
$(LIST): $(ELF)
|
||||||
|
@printf " OBJDUMP $(LIST)\n"
|
||||||
|
$(OBJDUMP) -S $(ELF) > $(LIST)
|
||||||
|
|
||||||
|
$(ELF): $(OBJDIR) $(OBJS) $(LDSCRIPT) $(LIB_DIR)/lib$(LIBNAME).a
|
||||||
|
@printf " LD $(ELF)\n"
|
||||||
|
$(LD) $(LDFLAGS) $(ARCH_FLAGS) $(OBJS) $(LDLIBS) -o $(ELF)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@printf " CLEAN\n"
|
||||||
|
$(RM) $(OBJS) $(OBJDIR)/*.d $(ELF) $(HEX) $(LIST) $(OBJDIR)/*.map
|
||||||
|
$(RMDIR) $(OBJDIR)
|
||||||
|
|
||||||
|
flash: $(BIN)
|
||||||
|
@printf " FLASH $(BIN)\n"
|
||||||
|
$(STFLASH) write $(BIN) 0x8000000
|
||||||
|
|
||||||
|
boot: $(BIN)
|
||||||
|
@printf " LOAD $(BIN) through bootloader\n"
|
||||||
|
$(STBOOT) -b$(BOOTSPEED) $(BOOTPORT) -w $(BIN)
|
||||||
|
|
||||||
|
.PHONY: clean elf hex list flash boot
|
||||||
|
|
||||||
|
#-include $(OBJS:.o=.d)
|
||||||
8
Jeep_generator/README
Normal file
8
Jeep_generator/README
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Jeep crankshaft signals generator
|
||||||
|
|
||||||
|
Speed from 180 to 6000RPM
|
||||||
|
Buttons "+" and "-", LEDS "MIN" and "MAX"
|
||||||
|
|
||||||
|
written for chinese devboard based on STM32F103RBT6
|
||||||
|
|
||||||
|
Press H for help in terminal
|
||||||
314
Jeep_generator/cdcacm.c
Normal file
314
Jeep_generator/cdcacm.c
Normal file
@ -0,0 +1,314 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cdcacm.h"
|
||||||
|
#include "user_proto.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
// Buffer for USB Tx
|
||||||
|
static uint8_t USB_Tx_Buffer[USB_TX_DATA_SIZE];
|
||||||
|
static uint8_t USB_Tx_ptr = 0;
|
||||||
|
// connection flag
|
||||||
|
uint8_t USB_connected = 0;
|
||||||
|
static const struct usb_device_descriptor dev = {
|
||||||
|
.bLength = USB_DT_DEVICE_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_DEVICE,
|
||||||
|
.bcdUSB = 0x0200,
|
||||||
|
.bDeviceClass = USB_CLASS_CDC,
|
||||||
|
.bDeviceSubClass = 0,
|
||||||
|
.bDeviceProtocol = 0,
|
||||||
|
.bMaxPacketSize0 = 64,
|
||||||
|
.idVendor = 0x0483,
|
||||||
|
.idProduct = 0x5740,
|
||||||
|
.bcdDevice = 0x0200,
|
||||||
|
.iManufacturer = 1,
|
||||||
|
.iProduct = 2,
|
||||||
|
.iSerialNumber = 3,
|
||||||
|
.bNumConfigurations = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
char usbdatabuf[USB_RX_DATA_SIZE]; // buffer for received data
|
||||||
|
int usbdatalen = 0; // lenght of received data
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This notification endpoint isn't implemented. According to CDC spec its
|
||||||
|
* optional, but its absence causes a NULL pointer dereference in Linux
|
||||||
|
* cdc_acm driver.
|
||||||
|
*/
|
||||||
|
static const struct usb_endpoint_descriptor comm_endp[] = {{
|
||||||
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
|
.bEndpointAddress = 0x83,
|
||||||
|
.bmAttributes = USB_ENDPOINT_ATTR_INTERRUPT,
|
||||||
|
.wMaxPacketSize = 16,
|
||||||
|
.bInterval = 255,
|
||||||
|
}};
|
||||||
|
|
||||||
|
static const struct usb_endpoint_descriptor data_endp[] = {{
|
||||||
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
|
.bEndpointAddress = 0x01,
|
||||||
|
.bmAttributes = USB_ENDPOINT_ATTR_BULK,
|
||||||
|
.wMaxPacketSize = 64,
|
||||||
|
.bInterval = 1,
|
||||||
|
}, {
|
||||||
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
|
.bEndpointAddress = 0x82,
|
||||||
|
.bmAttributes = USB_ENDPOINT_ATTR_BULK,
|
||||||
|
.wMaxPacketSize = 64,
|
||||||
|
.bInterval = 1,
|
||||||
|
}};
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
struct usb_cdc_header_descriptor header;
|
||||||
|
struct usb_cdc_call_management_descriptor call_mgmt;
|
||||||
|
struct usb_cdc_acm_descriptor acm;
|
||||||
|
struct usb_cdc_union_descriptor cdc_union;
|
||||||
|
} __attribute__((packed)) cdcacm_functional_descriptors = {
|
||||||
|
.header = {
|
||||||
|
.bFunctionLength = sizeof(struct usb_cdc_header_descriptor),
|
||||||
|
.bDescriptorType = CS_INTERFACE,
|
||||||
|
.bDescriptorSubtype = USB_CDC_TYPE_HEADER,
|
||||||
|
.bcdCDC = 0x0110,
|
||||||
|
},
|
||||||
|
.call_mgmt = {
|
||||||
|
.bFunctionLength =
|
||||||
|
sizeof(struct usb_cdc_call_management_descriptor),
|
||||||
|
.bDescriptorType = CS_INTERFACE,
|
||||||
|
.bDescriptorSubtype = USB_CDC_TYPE_CALL_MANAGEMENT,
|
||||||
|
.bmCapabilities = 0,
|
||||||
|
.bDataInterface = 1,
|
||||||
|
},
|
||||||
|
.acm = {
|
||||||
|
.bFunctionLength = sizeof(struct usb_cdc_acm_descriptor),
|
||||||
|
.bDescriptorType = CS_INTERFACE,
|
||||||
|
.bDescriptorSubtype = USB_CDC_TYPE_ACM,
|
||||||
|
.bmCapabilities = 0,
|
||||||
|
},
|
||||||
|
.cdc_union = {
|
||||||
|
.bFunctionLength = sizeof(struct usb_cdc_union_descriptor),
|
||||||
|
.bDescriptorType = CS_INTERFACE,
|
||||||
|
.bDescriptorSubtype = USB_CDC_TYPE_UNION,
|
||||||
|
.bControlInterface = 0,
|
||||||
|
.bSubordinateInterface0 = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct usb_interface_descriptor comm_iface[] = {{
|
||||||
|
.bLength = USB_DT_INTERFACE_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_INTERFACE,
|
||||||
|
.bInterfaceNumber = 0,
|
||||||
|
.bAlternateSetting = 0,
|
||||||
|
.bNumEndpoints = 1,
|
||||||
|
.bInterfaceClass = USB_CLASS_CDC,
|
||||||
|
.bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
|
||||||
|
.bInterfaceProtocol = USB_CDC_PROTOCOL_AT,
|
||||||
|
.iInterface = 0,
|
||||||
|
|
||||||
|
.endpoint = comm_endp,
|
||||||
|
|
||||||
|
.extra = &cdcacm_functional_descriptors,
|
||||||
|
.extralen = sizeof(cdcacm_functional_descriptors),
|
||||||
|
}};
|
||||||
|
|
||||||
|
static const struct usb_interface_descriptor data_iface[] = {{
|
||||||
|
.bLength = USB_DT_INTERFACE_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_INTERFACE,
|
||||||
|
.bInterfaceNumber = 1,
|
||||||
|
.bAlternateSetting = 0,
|
||||||
|
.bNumEndpoints = 2,
|
||||||
|
.bInterfaceClass = USB_CLASS_DATA,
|
||||||
|
.bInterfaceSubClass = 0,
|
||||||
|
.bInterfaceProtocol = 0,
|
||||||
|
.iInterface = 0,
|
||||||
|
|
||||||
|
.endpoint = data_endp,
|
||||||
|
}};
|
||||||
|
|
||||||
|
static const struct usb_interface ifaces[] = {{
|
||||||
|
.num_altsetting = 1,
|
||||||
|
.altsetting = comm_iface,
|
||||||
|
}, {
|
||||||
|
.num_altsetting = 1,
|
||||||
|
.altsetting = data_iface,
|
||||||
|
}};
|
||||||
|
|
||||||
|
static const struct usb_config_descriptor config = {
|
||||||
|
.bLength = USB_DT_CONFIGURATION_SIZE,
|
||||||
|
.bDescriptorType = USB_DT_CONFIGURATION,
|
||||||
|
.wTotalLength = 0,
|
||||||
|
.bNumInterfaces = 2,
|
||||||
|
.bConfigurationValue = 1,
|
||||||
|
.iConfiguration = 0,
|
||||||
|
.bmAttributes = 0x80,
|
||||||
|
.bMaxPower = 0x32,
|
||||||
|
|
||||||
|
.interface = ifaces,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *usb_strings[] = {
|
||||||
|
"SAO RAS, Emelianov E.V.",
|
||||||
|
"Jeep generator",
|
||||||
|
"0.0.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
// default line coding: B115200, 1stop, 8bits, parity none
|
||||||
|
struct usb_cdc_line_coding linecoding = {
|
||||||
|
.dwDTERate = 115200,
|
||||||
|
.bCharFormat = USB_CDC_1_STOP_BITS,
|
||||||
|
.bParityType = USB_CDC_NO_PARITY,
|
||||||
|
.bDataBits = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Buffer to be used for control requests. */
|
||||||
|
uint8_t usbd_control_buffer[128];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function runs every time it gets a request for control parameters get/set
|
||||||
|
* parameter SET_LINE_CODING used to change USART1 parameters: if you want to
|
||||||
|
* change them, just connect through USB with required parameters
|
||||||
|
*/
|
||||||
|
static int cdcacm_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf,
|
||||||
|
uint16_t *len, void (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req)){
|
||||||
|
(void)complete;
|
||||||
|
(void)buf;
|
||||||
|
(void)usbd_dev;
|
||||||
|
char local_buf[10];
|
||||||
|
struct usb_cdc_line_coding lc;
|
||||||
|
|
||||||
|
switch (req->bRequest) {
|
||||||
|
case SET_CONTROL_LINE_STATE:{
|
||||||
|
if(req->wValue){ // terminal is opened
|
||||||
|
USB_connected = 1;
|
||||||
|
}else{ // terminal is closed
|
||||||
|
USB_connected = 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* This Linux cdc_acm driver requires this to be implemented
|
||||||
|
* even though it's optional in the CDC spec, and we don't
|
||||||
|
* advertise it in the ACM functional descriptor.
|
||||||
|
*/
|
||||||
|
struct usb_cdc_notification *notif = (void *)local_buf;
|
||||||
|
/* We echo signals back to host as notification. */
|
||||||
|
notif->bmRequestType = 0xA1;
|
||||||
|
notif->bNotification = USB_CDC_NOTIFY_SERIAL_STATE;
|
||||||
|
notif->wValue = 0;
|
||||||
|
notif->wIndex = 0;
|
||||||
|
notif->wLength = 2;
|
||||||
|
local_buf[8] = req->wValue & 3;
|
||||||
|
local_buf[9] = 0;
|
||||||
|
usbd_ep_write_packet(usbd_dev, 0x83, local_buf, 10);
|
||||||
|
}break;
|
||||||
|
case SET_LINE_CODING:
|
||||||
|
if (!len || (*len != sizeof(struct usb_cdc_line_coding)))
|
||||||
|
return 0;
|
||||||
|
memcpy((void *)&lc, (void *)*buf, *len);
|
||||||
|
// Mark & Space parity don't support by hardware, check it
|
||||||
|
if(lc.bParityType == USB_CDC_MARK_PARITY || lc.bParityType == USB_CDC_SPACE_PARITY){
|
||||||
|
return 0; // error
|
||||||
|
}else{
|
||||||
|
// memcpy((void *)&linecoding, (void *)&lc, sizeof(struct usb_cdc_line_coding));
|
||||||
|
// UART_setspeed(USART1, &linecoding);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GET_LINE_CODING: // return linecoding buffer
|
||||||
|
if(len && *len == sizeof(struct usb_cdc_line_coding))
|
||||||
|
memcpy((void *)*buf, (void *)&linecoding, sizeof(struct usb_cdc_line_coding));
|
||||||
|
//usbd_ep_write_packet(usbd_dev, 0x83, (char*)&linecoding, sizeof(linecoding));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cdcacm_data_rx_cb(usbd_device *usbd_dev, uint8_t ep){
|
||||||
|
(void)ep;
|
||||||
|
int len = usbd_ep_read_packet(usbd_dev, 0x01, usbdatabuf + usbdatalen, USB_RX_DATA_SIZE - usbdatalen);
|
||||||
|
usbdatalen += len;
|
||||||
|
if(usbdatalen >= USB_RX_DATA_SIZE){ // buffer overflow - drop all its contents
|
||||||
|
usbdatalen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cdcacm_data_tx_cb(usbd_device *usbd_dev, uint8_t ep){
|
||||||
|
(void)ep;
|
||||||
|
(void)usbd_dev;
|
||||||
|
|
||||||
|
usb_send_buffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cdcacm_set_config(usbd_device *usbd_dev, uint16_t wValue)
|
||||||
|
{
|
||||||
|
(void)wValue;
|
||||||
|
(void)usbd_dev;
|
||||||
|
|
||||||
|
usbd_ep_setup(usbd_dev, 0x01, USB_ENDPOINT_ATTR_BULK, USB_RX_DATA_SIZE, cdcacm_data_rx_cb);
|
||||||
|
usbd_ep_setup(usbd_dev, 0x82, USB_ENDPOINT_ATTR_BULK, USB_TX_DATA_SIZE, cdcacm_data_tx_cb);
|
||||||
|
usbd_ep_setup(usbd_dev, 0x83, USB_ENDPOINT_ATTR_INTERRUPT, 16, NULL);
|
||||||
|
|
||||||
|
usbd_register_control_callback(
|
||||||
|
usbd_dev,
|
||||||
|
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
|
||||||
|
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
|
||||||
|
cdcacm_control_request);
|
||||||
|
}
|
||||||
|
|
||||||
|
static usbd_device *current_usb = NULL;
|
||||||
|
|
||||||
|
usbd_device *USB_init(){
|
||||||
|
current_usb = usbd_init(&stm32f103_usb_driver, &dev, &config,
|
||||||
|
usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer));
|
||||||
|
if(!current_usb) return NULL;
|
||||||
|
usbd_register_set_config_callback(current_usb, cdcacm_set_config);
|
||||||
|
return current_usb;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_t send_block_mutex = MUTEX_UNLOCKED;
|
||||||
|
/**
|
||||||
|
* Put byte into USB buffer to send
|
||||||
|
* @param byte - a byte to put into a buffer
|
||||||
|
*/
|
||||||
|
void usb_send(uint8_t byte){
|
||||||
|
mutex_lock(&send_block_mutex);
|
||||||
|
USB_Tx_Buffer[USB_Tx_ptr++] = byte;
|
||||||
|
mutex_unlock(&send_block_mutex);
|
||||||
|
if(USB_Tx_ptr == USB_TX_DATA_SIZE){ // buffer can be overflowed - send it!
|
||||||
|
usb_send_buffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send all data in buffer over USB
|
||||||
|
* this function runs when buffer is full or on SysTick
|
||||||
|
*/
|
||||||
|
void usb_send_buffer(){
|
||||||
|
if(MUTEX_LOCKED == mutex_trylock(&send_block_mutex)) return;
|
||||||
|
if(USB_Tx_ptr){
|
||||||
|
if(current_usb && USB_connected){
|
||||||
|
// usbd_ep_write_packet return 0 if previous packet isn't transmit yet
|
||||||
|
while(USB_Tx_ptr != usbd_ep_write_packet(current_usb, 0x82, USB_Tx_Buffer, USB_Tx_ptr));
|
||||||
|
usbd_poll(current_usb);
|
||||||
|
}
|
||||||
|
USB_Tx_ptr = 0;
|
||||||
|
}
|
||||||
|
mutex_unlock(&send_block_mutex);
|
||||||
|
}
|
||||||
54
Jeep_generator/cdcacm.h
Normal file
54
Jeep_generator/cdcacm.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* ccdcacm.h
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __CCDCACM_H__
|
||||||
|
#define __CCDCACM_H__
|
||||||
|
|
||||||
|
#include <libopencm3/usb/usbd.h>
|
||||||
|
|
||||||
|
// commands through EP0
|
||||||
|
#define SEND_ENCAPSULATED_COMMAND 0x00
|
||||||
|
#define GET_ENCAPSULATED_RESPONSE 0x01
|
||||||
|
#define SET_COMM_FEATURE 0x02
|
||||||
|
#define GET_COMM_FEATURE 0x03
|
||||||
|
#define CLEAR_COMM_FEATURE 0x04
|
||||||
|
#define SET_LINE_CODING 0x20
|
||||||
|
#define GET_LINE_CODING 0x21
|
||||||
|
#define SET_CONTROL_LINE_STATE 0x22
|
||||||
|
#define SEND_BREAK 0x23
|
||||||
|
|
||||||
|
// Size of input/output buffers
|
||||||
|
#define USB_TX_DATA_SIZE 64
|
||||||
|
#define USB_RX_DATA_SIZE 64
|
||||||
|
|
||||||
|
// USB connection flag
|
||||||
|
extern uint8_t USB_connected;
|
||||||
|
extern struct usb_cdc_line_coding linecoding;
|
||||||
|
|
||||||
|
extern char usbdatabuf[];
|
||||||
|
extern int usbdatalen;
|
||||||
|
|
||||||
|
usbd_device *USB_init();
|
||||||
|
void usb_send(uint8_t byte);
|
||||||
|
void usb_send_buffer();
|
||||||
|
|
||||||
|
#endif // __CCDCACM_H__
|
||||||
68
Jeep_generator/hardware_ini.c
Normal file
68
Jeep_generator/hardware_ini.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* hardware_ini.c - functions for HW initialisation
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All hardware-dependent initialisation & definition should be placed here
|
||||||
|
* and in hardware_ini.h
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "hardware_ini.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GPIO initialisaion: clocking + pins setup
|
||||||
|
*/
|
||||||
|
void GPIO_init(){
|
||||||
|
rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN);
|
||||||
|
// turn on pull-up
|
||||||
|
gpio_set(BTNS_PORT, BTN_PLUS_PIN | BTN_MINUS_PIN);
|
||||||
|
// turn off LEDs
|
||||||
|
gpio_set(LEDS_PORT, LED_LOW_PIN | LED_UPPER_PIN);
|
||||||
|
// Buttons: pull-up input
|
||||||
|
gpio_set_mode(BTNS_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN,
|
||||||
|
BTN_PLUS_PIN | BTN_MINUS_PIN);
|
||||||
|
// LEDS: opendrain output
|
||||||
|
gpio_set_mode(LEDS_PORT, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN,
|
||||||
|
LED_LOW_PIN | LED_UPPER_PIN);
|
||||||
|
// Tacting output (opendrain)
|
||||||
|
gpio_set_mode(OUTP_PORT, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN,
|
||||||
|
OUTP_PIN);
|
||||||
|
/*
|
||||||
|
// USB_DISC: push-pull
|
||||||
|
gpio_set_mode(USB_DISC_PORT, GPIO_MODE_OUTPUT_2_MHZ,
|
||||||
|
GPIO_CNF_OUTPUT_PUSHPULL, USB_DISC_PIN);
|
||||||
|
// USB_POWER: open drain, externall pull down with R7 (22k)
|
||||||
|
gpio_set_mode(USB_POWER_PORT, GPIO_MODE_INPUT,
|
||||||
|
GPIO_CNF_INPUT_FLOAT, USB_POWER_PIN);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SysTick used for system timer with period of 1ms
|
||||||
|
*/
|
||||||
|
void SysTick_init(){
|
||||||
|
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB_DIV8); // Systyck: 72/8=9MHz
|
||||||
|
systick_set_reload(8999); // 9000 pulses: 1kHz
|
||||||
|
systick_interrupt_enable();
|
||||||
|
systick_counter_enable();
|
||||||
|
}
|
||||||
|
|
||||||
80
Jeep_generator/hardware_ini.h
Normal file
80
Jeep_generator/hardware_ini.h
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* hardware_ini.h
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __HARDWARE_INI_H__
|
||||||
|
#define __HARDWARE_INI_H__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Timers:
|
||||||
|
* SysTick - system time
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void GPIO_init();
|
||||||
|
void SysTick_init();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Buttons "+"/"-"
|
||||||
|
*/
|
||||||
|
#define BTNS_PORT GPIOA
|
||||||
|
// PA10 -- increase speed
|
||||||
|
#define BTN_PLUS_PIN GPIO10
|
||||||
|
// PA9 -- decrease speed
|
||||||
|
#define BTN_MINUS_PIN GPIO9
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tacting out - PA4
|
||||||
|
*/
|
||||||
|
#define OUTP_PORT GPIOA
|
||||||
|
#define OUTP_PIN GPIO4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LEDS: PA0 for bottom, PA1 for upper limits
|
||||||
|
*/
|
||||||
|
#define LEDS_PORT GPIOA
|
||||||
|
#define LED_LOW_PIN GPIO0
|
||||||
|
#define LED_UPPER_PIN GPIO1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB interface
|
||||||
|
* connect boot1 jumper to gnd, boot0 to gnd; and reconnect boot0 to +3.3 to boot flash
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
// USB_DICS (disconnect) - PC11
|
||||||
|
#define USB_DISC_PIN GPIO11
|
||||||
|
#define USB_DISC_PORT GPIOC
|
||||||
|
// USB_POWER (high level when USB connected to PC)
|
||||||
|
#define USB_POWER_PIN GPIO10
|
||||||
|
#define USB_POWER_PORT GPIOC
|
||||||
|
// change signal level on USB diconnect pin
|
||||||
|
#define usb_disc_high() gpio_set(USB_DISC_PORT, USB_DISC_PIN)
|
||||||
|
#define usb_disc_low() gpio_clear(USB_DISC_PORT, USB_DISC_PIN)
|
||||||
|
// in case of n-channel FET on 1.5k pull-up change on/off disconnect means low level
|
||||||
|
// in case of pnp bipolar transistor or p-channel FET on 1.5k pull-up disconnect means high level
|
||||||
|
#define usb_disconnect() usb_disc_high()
|
||||||
|
#define usb_connect() usb_disc_low()
|
||||||
|
*/
|
||||||
|
// my simple devboard have no variants for programmed connection/disconnection of USB
|
||||||
|
#define usb_disconnect()
|
||||||
|
#define usb_connect()
|
||||||
|
|
||||||
|
#endif // __HARDWARE_INI_H__
|
||||||
BIN
Jeep_generator/jeep_generator.bin
Executable file
BIN
Jeep_generator/jeep_generator.bin
Executable file
Binary file not shown.
31
Jeep_generator/ld/stm32f103x4.ld
Normal file
31
Jeep_generator/ld/stm32f103x4.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 16K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 6K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103x6.ld
Normal file
31
Jeep_generator/ld/stm32f103x6.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 10K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103x8.ld
Normal file
31
Jeep_generator/ld/stm32f103x8.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103xB.ld
Normal file
31
Jeep_generator/ld/stm32f103xB.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103xC.ld
Normal file
31
Jeep_generator/ld/stm32f103xC.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103xD.ld
Normal file
31
Jeep_generator/ld/stm32f103xD.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 384K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103xE.ld
Normal file
31
Jeep_generator/ld/stm32f103xE.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103xF.ld
Normal file
31
Jeep_generator/ld/stm32f103xF.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 768K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 96K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
31
Jeep_generator/ld/stm32f103xG.ld
Normal file
31
Jeep_generator/ld/stm32f103xG.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Karl Palsson <karlp@tweak.net.au>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script for STM32F100x4, 16K flash, 4K RAM. */
|
||||||
|
|
||||||
|
/* Define memory regions. */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
|
||||||
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 96K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the common ld script. */
|
||||||
|
INCLUDE libopencm3_stm32f1.ld
|
||||||
|
|
||||||
122
Jeep_generator/main.c
Normal file
122
Jeep_generator/main.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* main.c
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "hardware_ini.h"
|
||||||
|
#include "cdcacm.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
volatile uint32_t Timer = 0; // global timer (milliseconds)
|
||||||
|
usbd_device *usbd_dev;
|
||||||
|
void check_btns();
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
uint32_t Old_timer = 0;
|
||||||
|
// RCC clocking: 8MHz oscillator -> 72MHz system
|
||||||
|
rcc_clock_setup_in_hse_8mhz_out_72mhz();
|
||||||
|
GPIO_init();
|
||||||
|
usb_disconnect(); // turn off USB while initializing all
|
||||||
|
// USB
|
||||||
|
usbd_dev = USB_init();
|
||||||
|
// SysTick is a system timer with 1ms period
|
||||||
|
SysTick_init();
|
||||||
|
tim2_init(); // start transmission
|
||||||
|
usb_connect(); // turn on USB
|
||||||
|
while(1){
|
||||||
|
usbd_poll(usbd_dev);
|
||||||
|
if(usbdatalen){ // there's something in USB buffer
|
||||||
|
usbdatalen = parce_incoming_buf(usbdatabuf, usbdatalen);
|
||||||
|
}
|
||||||
|
check_btns();
|
||||||
|
if(Timer - Old_timer > 999){ // one-second cycle
|
||||||
|
Old_timer += 1000;
|
||||||
|
}else if(Timer < Old_timer){ // Timer overflow
|
||||||
|
Old_timer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check buttons +/-
|
||||||
|
void check_btns(){
|
||||||
|
static uint8_t oldstate[2] = {1,1}, done[2] = {0,0}; // old buttons state, event handler flag
|
||||||
|
uint8_t i;
|
||||||
|
const char ltr[2] = {'+', '-'};
|
||||||
|
const uint32_t pins[2] = {BTN_PLUS_PIN, BTN_MINUS_PIN};
|
||||||
|
static uint32_t Old_timer[2] = {0,0};
|
||||||
|
for(i = 0; i < 2; i++){
|
||||||
|
uint8_t new = gpio_get(BTNS_PORT, pins[i]) ? 1 : 0;
|
||||||
|
// whe check button state at 3ms after event; don't mind events for 50ms after first
|
||||||
|
uint32_t O = Old_timer[i];
|
||||||
|
if(!O){ // no previous pauses
|
||||||
|
// button was pressed or released just now or holded
|
||||||
|
if(new != oldstate[i] || !new){
|
||||||
|
Old_timer[i] = Timer;
|
||||||
|
oldstate[i] = new;
|
||||||
|
}
|
||||||
|
}else{ // noice or real event?
|
||||||
|
if(Timer - O < 3){ // less than 3ms from last event
|
||||||
|
if(new != oldstate[i]){ // noice or button released
|
||||||
|
oldstate[i] = new;
|
||||||
|
Old_timer[i] = 0;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// more than 50ms from last event
|
||||||
|
if(Timer - O > 50 || O > Timer){ // clear new events masking
|
||||||
|
oldstate[i] = new;
|
||||||
|
Old_timer[i] = 0;
|
||||||
|
done[i] = 0;
|
||||||
|
}else{
|
||||||
|
if(!new && !done[i]){ // button pressed: just now or hold
|
||||||
|
usb_send(ltr[i]);
|
||||||
|
newline();
|
||||||
|
if(i) decrease_speed(); // "+"
|
||||||
|
else increase_speed();
|
||||||
|
done[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SysTick interrupt: increment global time & send data buffer through USB
|
||||||
|
*/
|
||||||
|
void sys_tick_handler(){
|
||||||
|
Timer++;
|
||||||
|
usbd_poll(usbd_dev);
|
||||||
|
usb_send_buffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
// pause function, delay in ms
|
||||||
|
void Delay(uint16_t _U_ time){
|
||||||
|
uint32_t waitto = Timer + time;
|
||||||
|
while(Timer < waitto);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* print current time in milliseconds: 4 bytes for ovrvlow + 4 bytes for time
|
||||||
|
* with ' ' as delimeter
|
||||||
|
*/
|
||||||
|
void print_time(){
|
||||||
|
print_int(Timer);
|
||||||
|
}
|
||||||
54
Jeep_generator/main.h
Normal file
54
Jeep_generator/main.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* main.h
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __MAIN_H__
|
||||||
|
#define __MAIN_H__
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h> // memcpy
|
||||||
|
#include <libopencm3/stm32/gpio.h>
|
||||||
|
//#include <libopencm3/stm32/usart.h>
|
||||||
|
#include <libopencm3/cm3/nvic.h>
|
||||||
|
#include <libopencm3/usb/cdc.h>
|
||||||
|
#include <libopencm3/usb/usbd.h>
|
||||||
|
#include <libopencm3/cm3/systick.h>
|
||||||
|
#include <libopencm3/stm32/rcc.h>
|
||||||
|
#include <libopencm3/stm32/adc.h>
|
||||||
|
//#include <libopencm3/stm32/dma.h>
|
||||||
|
#include <libopencm3/stm32/timer.h>
|
||||||
|
|
||||||
|
#define ADC_CHANNELS_NUMBER (10)
|
||||||
|
|
||||||
|
#include "sync.h" // mutexes
|
||||||
|
#include "user_proto.h"
|
||||||
|
|
||||||
|
#define _U_ __attribute__((__unused__))
|
||||||
|
#define U8(x) ((uint8_t) x)
|
||||||
|
#define U16(x) ((uint16_t) x)
|
||||||
|
#define U32(x) ((uint32_t) x)
|
||||||
|
|
||||||
|
extern volatile uint32_t Timer; // global timer (milliseconds)
|
||||||
|
void Delay(uint16_t time);
|
||||||
|
|
||||||
|
#endif // __MAIN_H__
|
||||||
|
|
||||||
93
Jeep_generator/sync.c
Normal file
93
Jeep_generator/sync.c
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Fergus Noble <fergusnoble@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO:
|
||||||
|
* implement mutexes for other type of MCU (which doesn't have strex & ldrex)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libopencm3/cm3/sync.h>
|
||||||
|
|
||||||
|
/* DMB is supported on CM0 */
|
||||||
|
void __dmb()
|
||||||
|
{
|
||||||
|
__asm__ volatile ("dmb");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Those are defined only on CM3 or CM4 */
|
||||||
|
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
|
||||||
|
|
||||||
|
uint32_t __ldrex(volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm__ volatile ("ldrex %0, [%1]" : "=r" (res) : "r" (addr));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t __strex(uint32_t val, volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm__ volatile ("strex %0, %2, [%1]"
|
||||||
|
: "=&r" (res) : "r" (addr), "r" (val));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mutex_lock(mutex_t *m)
|
||||||
|
{
|
||||||
|
uint32_t status = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
/* Wait until the mutex is unlocked. */
|
||||||
|
while (__ldrex(m) != MUTEX_UNLOCKED);
|
||||||
|
|
||||||
|
/* Try to acquire it. */
|
||||||
|
status = __strex(MUTEX_LOCKED, m);
|
||||||
|
|
||||||
|
/* Did we get it? If not then try again. */
|
||||||
|
} while (status != 0);
|
||||||
|
|
||||||
|
/* Execute the mysterious Data Memory Barrier instruction! */
|
||||||
|
__dmb();
|
||||||
|
}
|
||||||
|
|
||||||
|
void mutex_unlock(mutex_t *m)
|
||||||
|
{
|
||||||
|
/* Ensure accesses to protected resource are finished */
|
||||||
|
__dmb();
|
||||||
|
|
||||||
|
/* Free the lock. */
|
||||||
|
*m = MUTEX_UNLOCKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to lock mutex
|
||||||
|
* if it's already locked or there was error in STREX, return MUTEX_LOCKED
|
||||||
|
* else return MUTEX_UNLOCKED
|
||||||
|
*/
|
||||||
|
mutex_t mutex_trylock(mutex_t *m){
|
||||||
|
uint32_t status = 0;
|
||||||
|
mutex_t old_lock = __ldrex(m); // get mutex value
|
||||||
|
// set mutex
|
||||||
|
status = __strex(MUTEX_LOCKED, m);
|
||||||
|
if(status == 0) __dmb();
|
||||||
|
else old_lock = MUTEX_LOCKED;
|
||||||
|
return old_lock;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
53
Jeep_generator/sync.h
Normal file
53
Jeep_generator/sync.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the libopencm3 project.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Fergus Noble <fergusnoble@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBOPENCM3_CM3_SYNC_H
|
||||||
|
#define LIBOPENCM3_CM3_SYNC_H
|
||||||
|
|
||||||
|
void __dmb(void);
|
||||||
|
|
||||||
|
/* Implements synchronisation primitives as discussed in the ARM document
|
||||||
|
* DHT0008A (ID081709) "ARM Synchronization Primitives" and the ARM v7-M
|
||||||
|
* Architecture Reference Manual.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* --- Exclusive load and store instructions ------------------------------- */
|
||||||
|
|
||||||
|
/* Those are defined only on CM3 or CM4 */
|
||||||
|
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
|
||||||
|
|
||||||
|
uint32_t __ldrex(volatile uint32_t *addr);
|
||||||
|
uint32_t __strex(uint32_t val, volatile uint32_t *addr);
|
||||||
|
|
||||||
|
/* --- Convenience functions ----------------------------------------------- */
|
||||||
|
|
||||||
|
/* Here we implement some simple synchronisation primitives. */
|
||||||
|
|
||||||
|
typedef uint32_t mutex_t;
|
||||||
|
|
||||||
|
#define MUTEX_UNLOCKED 0
|
||||||
|
#define MUTEX_LOCKED 1
|
||||||
|
|
||||||
|
void mutex_lock(mutex_t *m);
|
||||||
|
void mutex_unlock(mutex_t *m);
|
||||||
|
mutex_t mutex_trylock(mutex_t *m);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
112
Jeep_generator/timer.c
Normal file
112
Jeep_generator/timer.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* timer.c
|
||||||
|
*
|
||||||
|
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
#include "user_proto.h" // for print_int
|
||||||
|
|
||||||
|
// current speed
|
||||||
|
int32_t current_RPM = 0;
|
||||||
|
void get_RPM();
|
||||||
|
uint16_t get_ARR(int32_t RPM);
|
||||||
|
|
||||||
|
// pulses: 16 1/0, 4 1/1, 16 1/0, 4 0/0,
|
||||||
|
const uint8_t pulses[] = {
|
||||||
|
1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
|
||||||
|
1,1,1,1,1,1,1,1,
|
||||||
|
1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
|
||||||
|
0,0,0,0,0,0,0,0};
|
||||||
|
const int pulsesLen = sizeof(pulses) - 1;
|
||||||
|
|
||||||
|
void tim2_init(){
|
||||||
|
// init TIM2
|
||||||
|
rcc_periph_clock_enable(RCC_TIM2);
|
||||||
|
timer_reset(TIM2);
|
||||||
|
// timer have frequency of 1MHz
|
||||||
|
timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
|
||||||
|
// 72MHz div 36 = 2MHz
|
||||||
|
TIM2_PSC = 35; // we need double freq to serve both halfs of signal
|
||||||
|
TIM2_ARR = get_ARR(MIN_RPM);
|
||||||
|
TIM2_DIER = TIM_DIER_UDE | TIM_DIER_UIE;
|
||||||
|
nvic_enable_irq(NVIC_TIM2_IRQ);
|
||||||
|
TIM2_CR1 |= TIM_CR1_CEN;
|
||||||
|
get_RPM();
|
||||||
|
}
|
||||||
|
|
||||||
|
void tim2_isr(){
|
||||||
|
static uint16_t ctr = 0;
|
||||||
|
if(TIM2_SR & TIM_SR_UIF){ // update interrupt
|
||||||
|
if(ctr > pulsesLen) ctr = 0;
|
||||||
|
if(pulses[++ctr]) gpio_set(OUTP_PORT, OUTP_PIN);
|
||||||
|
else gpio_clear(OUTP_PORT, OUTP_PIN);
|
||||||
|
TIM2_SR = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate motor speed in RPM
|
||||||
|
* RPM = 1/tim2_arr / 40 * 60
|
||||||
|
*/
|
||||||
|
void get_RPM(){
|
||||||
|
current_RPM = 3000000 / (int32_t)TIM2_ARR;
|
||||||
|
current_RPM /= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate TIM2_ARR by RPM
|
||||||
|
uint16_t get_ARR(int32_t RPM){
|
||||||
|
int32_t R = 3000000 / RPM;
|
||||||
|
R /= 2;
|
||||||
|
return (uint16_t)R;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change "rotation speed" by 100rpm
|
||||||
|
*/
|
||||||
|
void increase_speed(){
|
||||||
|
if(current_RPM == MAX_RPM) return;
|
||||||
|
current_RPM += 100;
|
||||||
|
if(current_RPM > MAX_RPM){ // set LED "MAX"
|
||||||
|
current_RPM = MAX_RPM;
|
||||||
|
TIM2_ARR = get_ARR(current_RPM);
|
||||||
|
gpio_clear(LEDS_PORT, LED_UPPER_PIN);
|
||||||
|
}else{
|
||||||
|
TIM2_ARR = get_ARR(current_RPM);
|
||||||
|
get_RPM(); // recalculate speed
|
||||||
|
gpio_set(LEDS_PORT, LED_UPPER_PIN);
|
||||||
|
}
|
||||||
|
gpio_set(LEDS_PORT, LED_LOW_PIN);
|
||||||
|
print_int(current_RPM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void decrease_speed(){
|
||||||
|
if(current_RPM == MIN_RPM) return;
|
||||||
|
current_RPM -= 100;
|
||||||
|
if(current_RPM < MIN_RPM){ // set LED "MIN"
|
||||||
|
current_RPM = MIN_RPM;
|
||||||
|
TIM2_ARR = get_ARR(current_RPM);
|
||||||
|
gpio_clear(LEDS_PORT, LED_LOW_PIN);
|
||||||
|
}else{
|
||||||
|
TIM2_ARR = get_ARR(current_RPM);
|
||||||
|
get_RPM();
|
||||||
|
gpio_set(LEDS_PORT, LED_LOW_PIN);
|
||||||
|
}
|
||||||
|
gpio_set(LEDS_PORT, LED_UPPER_PIN);
|
||||||
|
print_int(current_RPM);
|
||||||
|
}
|
||||||
43
Jeep_generator/timer.h
Normal file
43
Jeep_generator/timer.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* timer.h
|
||||||
|
*
|
||||||
|
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#ifndef __TIMER_H__
|
||||||
|
#define __TIMER_H__
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "hardware_ini.h"
|
||||||
|
|
||||||
|
//~ // 180rpm - 120Hz, T/2=8333us
|
||||||
|
//~ #define TM2_MIN_SPEED (8333)
|
||||||
|
//~ // 6000rpm - 4kHz, T/2=250us
|
||||||
|
//~ #define TM2_MAX_SPEED (250)
|
||||||
|
// max & min rotation speed
|
||||||
|
#define MAX_RPM (6000)
|
||||||
|
#define MIN_RPM (180)
|
||||||
|
|
||||||
|
|
||||||
|
void tim2_init();
|
||||||
|
void increase_speed();
|
||||||
|
void decrease_speed();
|
||||||
|
|
||||||
|
extern int32_t current_RPM;
|
||||||
|
|
||||||
|
#endif // __TIMER_H__
|
||||||
107
Jeep_generator/user_proto.c
Normal file
107
Jeep_generator/user_proto.c
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* user_proto.c
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cdcacm.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "hardware_ini.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
void help(){
|
||||||
|
P("g\tShow this help\n");
|
||||||
|
P("t\tShow current approx. time\n");
|
||||||
|
P("+\tIncrease speed by 100\n");
|
||||||
|
P("-\tDecrease speed by 100\n");
|
||||||
|
P("g\tGet current speed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parce command buffer buf with length len
|
||||||
|
* return 0 if buffer processed or len if there's not enough data in buffer
|
||||||
|
*/
|
||||||
|
int parce_incoming_buf(char *buf, int len){
|
||||||
|
uint8_t command;
|
||||||
|
int i = 0;
|
||||||
|
for(; i < len; i++){
|
||||||
|
command = buf[i];
|
||||||
|
if(!command) continue; // omit zero
|
||||||
|
switch (command){
|
||||||
|
case 'h': // show help
|
||||||
|
help();
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
newline();
|
||||||
|
print_int(Timer); // be careful for Time >= 2^{31}!!!
|
||||||
|
newline();
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
P("Current speed: ");
|
||||||
|
print_int(current_RPM);
|
||||||
|
P("rpm\n");
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
increase_speed();
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
decrease_speed();
|
||||||
|
break;
|
||||||
|
break;
|
||||||
|
case '\n': // show newline, space and tab as is
|
||||||
|
case '\r':
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
command = '?'; // echo '?' on unknown command in byte mode
|
||||||
|
}
|
||||||
|
usb_send(command); // echo readed byte
|
||||||
|
}
|
||||||
|
return 0; // all data processed - 0 bytes leave in buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send char array wrd thru USB or UART
|
||||||
|
*/
|
||||||
|
void prnt(uint8_t *wrd){
|
||||||
|
if(!wrd) return;
|
||||||
|
while(*wrd) usb_send(*wrd++);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print decimal integer value
|
||||||
|
* @param N - value to print
|
||||||
|
* @param s - function to send a byte
|
||||||
|
*/
|
||||||
|
void print_int(int32_t N){
|
||||||
|
uint8_t buf[10], L = 0;
|
||||||
|
if(N < 0){
|
||||||
|
usb_send('-');
|
||||||
|
N = -N;
|
||||||
|
}
|
||||||
|
if(N){
|
||||||
|
while(N){
|
||||||
|
buf[L++] = N % 10 + '0';
|
||||||
|
N /= 10;
|
||||||
|
}
|
||||||
|
while(L--) usb_send(buf[L]);
|
||||||
|
}else usb_send('0');
|
||||||
|
}
|
||||||
|
|
||||||
47
Jeep_generator/user_proto.h
Normal file
47
Jeep_generator/user_proto.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* user_proto.h
|
||||||
|
*
|
||||||
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __USER_PROTO_H__
|
||||||
|
#define __USER_PROTO_H__
|
||||||
|
|
||||||
|
#include "cdcacm.h"
|
||||||
|
|
||||||
|
// shorthand for prnt
|
||||||
|
#define P(arg) do{prnt((uint8_t*)arg);}while(0)
|
||||||
|
// debug message - over USB
|
||||||
|
#ifdef EBUG
|
||||||
|
#define DBG(a) do{prnt((uint8_t*)a);}while(0)
|
||||||
|
#else
|
||||||
|
#define DBG(a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef uint8_t (*intfun)(int32_t);
|
||||||
|
|
||||||
|
void prnt(uint8_t *wrd);
|
||||||
|
#define newline() usb_send('\n')
|
||||||
|
|
||||||
|
void print_int(int32_t N);
|
||||||
|
void print_hex(uint8_t *buff, uint8_t l);
|
||||||
|
|
||||||
|
int parce_incoming_buf(char *buf, int len);
|
||||||
|
|
||||||
|
#endif // __USER_PROTO_H__
|
||||||
1
README
1
README
@ -10,6 +10,7 @@ Be carefull: due to API changes these projects will compile only with opencm3 fr
|
|||||||
- GPS - first approximation to GPS clock
|
- GPS - first approximation to GPS clock
|
||||||
- GPS+ultrasonic - GPS-based timelapse tool allows to get precision (milliseconds) time for four types of sensors
|
- GPS+ultrasonic - GPS-based timelapse tool allows to get precision (milliseconds) time for four types of sensors
|
||||||
- hid_mouse_keyboard - a very simple example of simultaneous STM32 work as compound USB-HID device: usb & mouse
|
- hid_mouse_keyboard - a very simple example of simultaneous STM32 work as compound USB-HID device: usb & mouse
|
||||||
|
- Jeep_generator - krancshaft signal emulator for Jeep
|
||||||
- keyboard_snippet - This snippet allows to emulate USB keyboard
|
- keyboard_snippet - This snippet allows to emulate USB keyboard
|
||||||
- matrix_keyboard - connect simple matrix keyboard 3x3 or 4x4 to computer as regular USB keyboard
|
- matrix_keyboard - connect simple matrix keyboard 3x3 or 4x4 to computer as regular USB keyboard
|
||||||
- nokia5110 - print on a nokia5110 display text sent by terminal
|
- nokia5110 - print on a nokia5110 display text sent by terminal
|
||||||
|
|||||||
@ -9,7 +9,7 @@ keyboard on which somebody types time of sensors' state changing
|
|||||||
|
|
||||||
#### Sensors supprorted
|
#### Sensors supprorted
|
||||||
* four lasers or other things, catch signal 0->1
|
* four lasers or other things, catch signal 0->1
|
||||||
* simple switch-button, catch signal 1->0
|
* simple switch-button, catch signal 0->1
|
||||||
|
|
||||||
To get precision time this tool use GPS module (NEO-6M)
|
To get precision time this tool use GPS module (NEO-6M)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user