Примеры кода:
Участок кода отсюда:
http://www.avislab.com/blog/stm32-bldc_ru/Спойлер
Код:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_dma.h"
#include "misc.h"
#include "string.h"
#include "stdio.h"
#include "sysclk.h"
#include "adc_dma.h"
#include "bldc.h"
int main(void)
{
// Set clock
SetSysClockTo72();
// ADC Init
ADC_DMA_init();
// TIM1, outputs, inputs, interrupts, etc. Init
BLDC_Init();
// Reverse pin Init
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
while(1)
{
if (ADCBuffer[0] > BLDC_ADC_START) {
if (BLDC_MotorGetSpin() == BLDC_STOP) {
// Check Reverse pin
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) != 0) {
// Forward
BLDC_MotorSetSpin(BLDC_CW);
}
else {
// Backward
BLDC_MotorSetSpin(BLDC_CCW);
}
BLDC_MotorCommutation(BLDC_HallSensorsGetPosition());
}
BLDC_SetPWM(BLDC_ADCToPWM(ADCBuffer[0]));
}
else {
if (BLDC_MotorGetSpin() != BLDC_STOP) {
if (ADCBuffer[0] < BLDC_ADC_STOP) {
BLDC_MotorStop();
}
}
}
}
}
Участок кода отсюда:
http://pcus.ru/news/180-prikruchivaem-k ... o-SPI.htmlСпойлер
Код:
//глобальная переменная для определения типа карты
uint8_t SDHC;
//макроопределения для управления выводом SS
#define CS_ENABLE GPIOA->BSRR = GPIO_BSRR_BR4;
#define CS_DISABLE GPIOA->BSRR = GPIO_BSRR_BS4;
//********************************************************************************************
//function посылка команды в SD //
//Arguments команда и ее аргумент //
//return 0xff - нет ответа //
//********************************************************************************************
uint8_t SD_sendCommand(uint8_t cmd, uint32_t arg)
{
uint8_t response, wait=0, tmp;
//для карт памяти SD выполнить коррекцию адреса, т.к. для них адресация побайтная
if(SDHC == 0)
if(cmd == READ_SINGLE_BLOCK || cmd == WRITE_SINGLE_BLOCK ) {arg = arg << 9;}
//для SDHC коррекцию адреса блока выполнять не нужно(постраничная адресация)
CS_ENABLE;
//передать код команды и ее аргумент
spi_send(cmd | 0x40);
spi_send(arg>>24);
spi_send(arg>>16);
spi_send(arg>>8);
spi_send(arg);
//передать CRC (учитываем только для двух команд)
if(cmd == SEND_IF_COND) spi_send(0x87);
else spi_send(0x95);
//ожидаем ответ
while((response = spi_read()) == 0xff)
if(wait++ > 0xfe) break; //таймаут, не получили ответ на команду
//проверка ответа если посылалась команда READ_OCR
if(response == 0x00 && cmd == 58)
{
tmp = spi_read(); //прочитать один байт регистра OCR
if(tmp & 0x40) SDHC = 1; //обнаружена карта SDHC
else SDHC = 0; //обнаружена карта SD
//прочитать три оставшихся байта регистра OCR
spi_read();
spi_read();
spi_read();
}
spi_read();
CS_DISABLE;
return response;
}
Что такое >, &, &it? Что то вроде адресации памяти?