STM32F030K6 настройка программы

Кто любит RISC в жизни, заходим, не стесняемся.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

STM32F030K6 настройка программы

Сообщение service47 »

Использую МК STM32F030K6T6 даташит: http://www.st.com/st-web-ui/static/acti ... 088500.pdf
Пробую программы-примеры, приведенные тут:
http://www.compel.ru/wordpress/wp-conte ... TM32F4.pdf

Нужно, чтобы сегменты на индикаторе, подключенные к пинам порта А 9,10,13,14 мигали через 1 секунду.
С помощью функции delay и с помощью прерывания таймера.
Вопрос: правильно ли прописана настройка таймера и как его правильно настроить.

Спойлер

Код: Выделить всё

#include "main.h"
#include "stm32f0xx_conf.h"
#include "system_stm32f0xx.h"

void Delay(uint32_t nCount)
{
 while(nCount--)
 {
 }
}
int main(void)
{
 GPIO_InitTypeDef gpioConf;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_9;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_10;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_13;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_14;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

void INTTIM_Config(void);
void GPIO_Config(void);
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
void TIM15_IRQHandler(void);
{
if (TIM_GetITStatus(TIM15, TIM_IT_Update) != RESET) 
{
TIM_ClearITPendingBit(TIM15, TIM_IT_Update);
GPIOA->ODR ^= GPIO_Pin_2;
}
}

void GPIO_Config(void);
{
GPIO_InitTypeDef gpio_struct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
gpio_struct.GPIO_Pin = GPIO_Pin_2;
gpio_struct.GPIO_Mode = GPIO_Mode_OUT;
gpio_struct.GPIO_OType = GPIO_OType_PP;
gpio_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_struct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &gpio_struct);
}

void INTTIM_Config(void);
{
NVIC_InitTypeDef nvic_struct;
nvic_struct.NVIC_IRQChannel = TIM15_IRQn;
//nvic_struct.NVIC_IRQChannelPreemptionPriority = 0;
//nvic_struct.NVIC_IRQChannelSubPriority = 1;
nvic_struct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_struct);
TIM_TimeBaseInitTypeDef tim_struct;
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM15, ENABLE);
tim_struct.TIM_Period = 10000 - 1;
tim_struct.TIM_Prescaler = 168 - 1;
tim_struct.TIM_ClockDivision = 0;
tim_struct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM15, &tim_struct);
TIM_ITConfig(TIM15, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM15, ENABLE);
}

while(1) {
//if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0) {
//if (GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_9))
GPIO_ResetBits(GPIOA, GPIO_Pin_9);
GPIO_ResetBits(GPIOA, GPIO_Pin_10);
GPIO_ResetBits(GPIOA, GPIO_Pin_13);
GPIO_ResetBits(GPIOA, GPIO_Pin_14);
//else
Delay(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_9);
GPIO_SetBits(GPIOA, GPIO_Pin_10);
GPIO_SetBits(GPIOA, GPIO_Pin_13);
GPIO_SetBits(GPIOA, GPIO_Pin_14);
//while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)==0);
Delay(1000);
//}
}
}

Реклама
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

настройка вроде правильно, только у К6 нет 15-го таймера :)
см примечания внизу картинки в даташите.
Реклама
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Еще не светятся сегменты на индикаторе, подключенные к пинам PB1, PF0, PF1. Правильно ли настроены пины.
Спойлер

Код: Выделить всё

 GPIO_InitTypeDef gpioConf;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_0;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);
Переписал программу на таймер 1, нужно настроить на прерывание по переполнению.
Спойлер

Код: Выделить всё


static void TIM_Config(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* GPIOA and GPIOB clocks enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);

  /* TIM1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /* GPIOA Configuration: Channel 1, 2, 1N and 3 as alternate function push-pull */
  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* GPIOB Configuration: Channel 2N and 3N as alternate function push-pull */
  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_12;
  //GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Connect TIM pins to AF2 */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2);
  //GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
  //GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);
  //GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2);
  //GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_2);
  //GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_2);
  //GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_2);
  
  /*----------------------------------------------------------------------------
  The STM32F0xx TIM1 peripheral offers the possibility to program in advance the 
  configuration for the next TIM1 outputs behaviour (step) and change the configuration
  of all the channels at the same time. This operation is possible when the COM 
  (commutation) event is used.
  The COM event can be generated by software by setting the COM bit in the TIM1_EGR
  register or by hardware (on TRC rising edge).
  In this example, a software COM event is generated each 100 ms: using the SysTick 
  interrupt.
  The TIM1 is configured in Timing Mode, each time a COM event occurs, a new TIM1 
  configuration will be set in advance.

  The following Table  describes the TIM1 Channels states:
              -----------------------------------------------
             | Step1 | Step2 | Step3 | Step4 | Step5 | Step6 |
   ----------------------------------------------------------
  |Channel1  |   1   |   0   |   0   |   0   |   0   |   1   |
   ----------------------------------------------------------
  |Channel1N |   0   |   0   |   1   |   1   |   0   |   0   |
   ----------------------------------------------------------
  |Channel2  |   0   |   0   |   0   |   1   |   1   |   0   |
   ----------------------------------------------------------
  |Channel2N |   1   |   1   |   0   |   0   |   0   |   0   |
   ----------------------------------------------------------
  |Channel3  |   0   |   1   |   1   |   0   |   0   |   0   |
   ----------------------------------------------------------
  |Channel3N |   0   |   0   |   0   |   0   |   1   |   1   |
   ----------------------------------------------------------
  ----------------------------------------------------------------------------*/

  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 4095;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 2047;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = 1023;
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = 511;
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  TIM_BDTRInitStructure.TIM_DeadTime = 1;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

  TIM_CCPreloadControl(TIM1, ENABLE);

  TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);

  /* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);

  /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  /* Enable the TIM1 Trigger and commutation interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);   
  }

void TIM1_IRQHandler(void)
{
    GPIO_SetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_SetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_SetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_SetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_SetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_SetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_SetBits(GPIOA, GPIO_Pin_13);  //G
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
}
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

СпойлерRCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &gpioConf);
Реклама
Эиком - электронные компоненты и радиодетали
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Правильно ли настроена генерация ШИМ.
Пин РА4 (ТIM14_CH1). На выходе присутствуют импульсы, как поменять их длительность.
И почему этот TIM14_CH1 в даташите также есть у TSSOP20 на выводе PB1.
Спойлер

Код: Выделить всё

static void TIM_Config2(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOA, GPIOB and GPIOE Clocks enable */
  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
  
  /* GPIOA Configuration: Channel 1, 2, 3, 4 and Channel 1N as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0);
    
  /* GPIOB Configuration: Channel 2N and 3N as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_Init(GPIOA, &GPIO_InitStructure); 

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0); 
  
 
  /* TIM1 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14 , ENABLE);
  
  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = (48000000 / 4800000) - 1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 149;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);

  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 50;//Channel1Pulse;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OC1Init(TIM14, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = 50;//Channel2Pulse;
  TIM_OC2Init(TIM14, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = 50;//Channel3Pulse;
  TIM_OC3Init(TIM14, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = 50;//Channel4Pulse;
  TIM_OC4Init(TIM14, &TIM_OCInitStructure);

  /* TIM1 counter enable */
  TIM_Cmd(TIM14, ENABLE);

  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM14, ENABLE);
}
Реклама
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

Прескалер отключен, период импульсов канала 1 ~ 3.1 us ( 149/48,000,000) .
Длительность импульса ~ 1 us ( 50/48,000,000) ,
Спойлер/* Channel 1, 2,3 and 4 Configuration in PWM mode */
/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

TIM_OCInitStructure.TIM_Pulse = 50; //************** Channel1Pulse;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC1Init(TIM14, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 50;//Channel2Pulse;
TIM_OC2Init(TIM14, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 50;//Channel3Pulse;
TIM_OC3Init(TIM14, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 50;//Channel4Pulse;
TIM_OC4Init(TIM14, &TIM_OCInitStructure);
у таймера может быть до 4-х каналов сравнения , каждый канал может иметь два выхода - позитивный и негативный.
У TIM14 есть только один канал с позитивным выходом .
Вывода 1N нет , каналов 2,3,4 нет . Их все не нужно конфигурировать .

TIM14_CH1 может быть выведен на :
PA4 , PA7 - как AF4
PB1 - как AF0
Спойлер// PA4 - как AF4

/* GPIOA Configuration: Channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_4);


//либо PA7 - как AF4

/* GPIOA Configuration: Channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_4);

//либо PB1 - как AF0

/* GPIOA Configuration: Channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_0);
Реклама
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Спасибо. На осциллограммах форма импульсов странная. Какие должны быть значения period и pulse, чтобы напряжение на выводе менялось от 0,5В до 3,6В.
Вложения
Image6_pulse400000_period1000000_Upwm=2.89V.png
(3.92 КБ) 818 скачиваний
Image5_pulse490000_period500000_Upwm=2.8V.png
(3.81 КБ) 726 скачиваний
Image4_pulse400000_period500000_Upwm=2.97V.png
(3.75 КБ) 769 скачиваний
Image1_pulse3000_period5000_Upwm=2.9V.png
(3.98 КБ) 703 скачивания
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

В TIM14 регистры 16 бит , макс. значение 65535.
из Ваших 100000 - 500000 сами посчитаете что пишется.
16 битный шим делать в лоб смысла нет, частота пульсов будет порядка 700 Гц
и опора не обеспечит стабильности в 16 бит.

для 10 бит шима частота пульсов порядка 47 кГц. Пример с SPL ниже.
шим можно переделать на 9, 8, 7 разрядов - частота будет выше и проще фильтровать.

TIM14 Ch1 Slow Glow 0.5v->3.3v
Duty шима меняется в SysTick_Handler.
проверено на диско051 , для 030 должно работать.
Спойлер// TIM14 PWM Glow
// 2015-10-27
// radiokot just for fun
#include <stdlib.h>
#include "stm32f0xx.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpio.h"

volatile uint16_t glow_counter = 142;

int main(void)
{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA clock enable */
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA , ENABLE);
/* TIM14 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14 , ENABLE);

/* GPIOA Configuration: Channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_4);


TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 1023;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);


/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 142; // Duty =142/1023 ; Vout= 3.6*142/1023 = 0.5v;
// TIM_OCInitStructure.TIM_Pulse = 1022; // Duty =1022/1023 ; Vout= 3.6*1022/1023 = 3.6v;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;


TIM_OC1Init(TIM14, &TIM_OCInitStructure);

TIM_Cmd(TIM14, ENABLE);



// start SysTick timer @ 100 Hz "
if (SysTick_Config(SystemCoreClock /100))
{
while (1) {}
}

// main loop

while (1)
{
}

} // main()



void SysTick_Handler(void)
{
if ( glow_counter < 1022 )
{
glow_counter++;
}

else
{
glow_counter = 142;
}

TIM14->CCR1 = glow_counter;
}



void NMI_Handler(void)
{
}


void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}


void SVC_Handler(void)
{
}


void PendSV_Handler(void)
{
}

/* EOF */
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Спасибо, работает, сделал, чтобы при нажатии на кнопку устанавливалось значение CCR1=142, в первичных настройках таймера CCR1=1022, так при нажатии на кнопку срабатывает, а после отпускания почему-то становиться как при первичных настройках.

Еще требуется настроить АЦП. PA0 ADC0 и PA1 ADC1. Правильно ли настроено.
Спойлер

Код: Выделить всё


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_0;
gpioConf.GPIO_Mode = GPIO_Mode_AF;  //ADC0
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// инициализация входа, подключенного к светодиоду
gpioConf.GPIO_Pin = GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_AF;  //ADC1
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);


static void ADC_Config(void)
{
  ADC_InitTypeDef     ADC_InitStructure;
  GPIO_InitTypeDef    GPIO_InitStructure;
  
  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  
  /* Configure ADC Channel11 as analog input */
#ifdef USE_STM320518_EVAL
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
#else
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
#endif /* USE_STM320518_EVAL */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* ADCs DeInit */  
  ADC_DeInit(ADC1);
  
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
  
  /* Configure the ADC1 in continuous mode with a resolution equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure); 
  
  /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ 
#ifdef USE_STM320518_EVAL
  ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_239_5Cycles);
#else
  ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_239_5Cycles);
#endif /* USE_STM320518_EVAL */

  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
  /* Enable the ADC peripheral */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADRDY flag */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); 
  
  /* ADC1 regular Software Start Conv */ 
  ADC_StartOfConversion(ADC1);
}

static void ADC_Config2(void)
{
  ADC_InitTypeDef     ADC_InitStructure;
  GPIO_InitTypeDef    GPIO_InitStructure;
  
  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  
  /* Configure ADC Channel11 as analog input */
#ifdef USE_STM320518_EVAL
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
#else
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
#endif /* USE_STM320518_EVAL */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* ADCs DeInit */  
  ADC_DeInit(ADC1);
  
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
  
  /* Configure the ADC1 in continuous mode with a resolution equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure); 
  
  /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ 
#ifdef USE_STM320518_EVAL
  ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);
#else
  ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);
#endif /* USE_STM320518_EVAL */

  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
  /* Enable the ADC peripheral */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADRDY flag */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); 
  
  /* ADC1 regular Software Start Conv */ 
  ADC_StartOfConversion(ADC1);
}
Непонятно как задать ADC0, в нижеследующем коде. В файле stm32f0xx_adc.h ADC0 нет.
Спойлер

Код: Выделить всё

/* Test EOC flag */
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    
    /* Get ADC1 converted data */
    ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

Еще требуется настроить АЦП. PA0 ADC0 и PA1 ADC1. Правильно ли настроено.
неверный подход.
В F030 есть только один АЦП - ADC1.
ADC_Ch0, ADC_Ch1 - это каналы аналогового мультиплексора перед ADC1.
ADC1 нужно настроить и откалибровать oдин раз и обращаться только к нему.

Для измерения разных источников нужно переключать каналы мультиплексора командами :

ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_239_5Cycles);

ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);

время выборки должно быть настроено под задачу.

ADC_SampleTime_239_5Cycles - выборка максимально долгая.
ADC_SampleTime_1_5Cycles - самая короткая и требует быстрый операционный усилитель как буфер , резистор 50-100 ом и конденсатор ~2000 pF на входе АЦП.
см мануалы.

перед переключением каналов нужно убедиться, что АЦП не активен - читать флаг .
в программ мануале целая процедура расписана, с примерами.

Реально с переключением 2-х каналов выборки получатся с интервалом порядка 3 микросекунд на минимальном времени выборки 1_5Cycles.

Если нужно цифровать два канала на максимальной скорости - М0 не лучший выбор.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Спасибо. Осталось понять почему пины, подключенные к программатору PA13 SWDIO, PA14 SWCLK, а также PB1 и PF0, PF1, подключенные также к индикатору не светят сегменты на индикаторе.
Спойлер

Код: Выделить всё

 GPIO_InitTypeDef gpioConf;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
gpioConf.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1);
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
gpioConf.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
gpioConf.GPIO_Mode = GPIO_Mode_AF;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
gpioConf.GPIO_Pin = (GPIO_Pin_3 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_13 | GPIO_Pin_14);
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
gpioConf.GPIO_Pin = (GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
gpioConf.GPIO_Mode = GPIO_Mode_IN;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
gpioConf.GPIO_Pin = GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf);
Спойлер

Код: Выделить всё

  if(a==0)
  {
    //GPIO_ResetBits(GPIOF, GPIO_Pin_0);  //A
    //GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    //GPIO_ResetBits(GPIOB, GPIO_Pin_1);  //D
    //GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //C
    //GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    //GPIO_ResetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_ResetBits(GPIOA, GPIO_Pin_13);  //G
    GPIO_ResetBits(GPIOA, GPIO_Pin_14);  //DP
    GPIO_SetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_SetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_SetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_SetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_SetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_SetBits(GPIOA, GPIO_Pin_10);  //F
    //GPIO_SetBits(GPIOA, GPIO_Pin_13);  //G
    //GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
  }
И как полностью отключить ШИМ на таймере 14.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32F030K6 настройка программы

Сообщение oleg110592 »

Код: Выделить всё

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
gpioConf.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1);
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf); ???
GPIO_Init(GPIOF, &gpioConf); наверное так
......
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
gpioConf.GPIO_Pin = GPIO_Pin_1;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_50MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpioConf); ???
GPIO_Init(GPIOB, &gpioConf); наверное так
зачем три раза включается тактирование порта A ?

Код: Выделить всё

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
так проще порты настраивать (имхо):

Код: Выделить всё

    /* GPIOA Periph clock enable */
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
    /* Configure output  mode  */
    GPIOA->MODER |=  (GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0 |
                      GPIO_MODER_MODER2_0 | GPIO_MODER_MODER3_0 |
                      GPIO_MODER_MODER4_0 | GPIO_MODER_MODER5_0 ); 	
    /* Maximum speed setting */
    GPIOA->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR1 |
                        GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3 |
                        GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5); 	
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Спасибо. Нужно Настроить на 20МГц из 48. HSI/2 и на множитель 5 через PLL.

В даташите приведен такой код:
Спойлер

Код: Выделить всё

PLL configuration modification code example
/* (1) Test if PLL is used as System clock */
/* (2) Select HSI as system clock */
/* (3) Wait for HSI switched */
/* (4) Disable the PLL */
/* (5) Wait until PLLRDY is cleared */
/* (6) Set the PLL multiplier to 6 */
/* (7) Enable the PLL */
/* (8) Wait until PLLRDY is set */
/* (9) Select PLL as system clock */
/* (10) Wait until the PLL is switched on */
if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_PLL) /* (1) */
{
RCC->CFGR &= (uint32_t) (~RCC_CFGR_SW); /* (2) */
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) /* (3) */
{
/* For robust implementation, add here time-out management */
}
}
RCC->CR &= (uint32_t)(~RCC_CR_PLLON);/* (4) */
while((RCC->CR & RCC_CR_PLLRDY) != 0) /* (5) */
{
/* For robust implementation, add here time-out management */
}
RCC->CFGR = RCC->CFGR & (~RCC_CFGR_PLLMUL) | (RCC_CFGR_PLLMUL6); /* (6) */
RCC->CR |= RCC_CR_PLLON; /* (7) */
while((RCC->CR & RCC_CR_PLLRDY) == 0) /* (8) */
{
/* For robust implementation, add here time-out management */
}
RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL); /* (9) */
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) /* (10) */
{
/* For robust implementation, add here time-out management */
}
В iar не работает.

И как полностью отключить ШИМ на таймере 14. 0/1023 и 1023/1023 в pulse не работает, светодиод все равно светиться.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32F030K6 настройка программы

Сообщение oleg110592 »

пользуюсь экселевским файлом STM32F0xx_Clock_Configuration_V1.0.1.xls
http://www.st.com/web/en/catalog/tools/PF257924#
Изображение
он генерит файл system_stm32f0xx.c, который используется в стандартном проекте.
отключить ШИМ можно так: отключить тактирование таймера, затем настроить выход, используемый шимом как обычный порт и записать туда "0"
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

GPIOA->MODER |= (GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0 |
GPIO_MODER_MODER2_0 | GPIO_MODER_MODER3_0 |
GPIO_MODER_MODER4_0 | GPIO_MODER_MODER5_0 );
/* Maximum speed setting */
GPIOA->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR1 |
GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3 |
GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5);
это же конструкци из HAL ? чтобы ими пользоаться нужно еще и хал хедеры подключать .
там и без этого заморочек хватает :)

таймер можно совсем выключить TIM_Cmd(TIM14, DISABLE);
или клок с него снять.
можно только выход установить TIM_ForcedOC1Config(TIM14, ForcedAction_Inactive);
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32F030K6 настройка программы

Сообщение oleg110592 »

pixar писал(а):это же конструкци из HAL ? чтобы ими пользоаться нужно еще и хал хедеры подключать .
там и без этого заморочек хватает :)
никаких халов - работа напрямую с регистрами, достаточно одного родного хидера типа stm32f0xx.h
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Еще раз спасибо. HCLK 20МГц это и есть рабочая частота или все же SYSCLK это.
Спойлер

Код: Выделить всё

  *        System Clock source                    | HSI
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 8000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 20000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB Prescaler                          | 1
У индикатора сегменты, выключенные командой
GPIO_ResetBits(GPIOA, GPIO_Pin_10); //F
светятся наполовину, как их отключить полностью.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32F030K6 настройка программы

Сообщение oleg110592 »

у меня так сгенерило:
Спойлер

Код: Выделить всё

  *=======================
  *=======================
  *        System Clock source                    | PLL(HSI)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 20000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 20000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | NA
  *----------------------------------------------------------------------------
  *        PLLMUL                                 | 5
  *-----------------------------------------------------------------------------
  *        PREDIV                                 | 2
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 0
  *-----------------------------------------------------------------------------
  *        Prefetch Buffer                        | ON
  *-----------------------------------------------------------------------------
светятся наполовину
схема есть?

на всякий - тут сегментами управлял - в начале с халом, потом без http://radiokot.ru/forum/viewtopic.php? ... 7#p2057277
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

светятся наполовину, как их отключить полностью.
бывает, если индикаторы с общим анодом запитаны от 5 вольт. утечка через защитные диоды.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Индикатор с общим катодом, через резистор на сеть GND, пины сегментов на выводы STM.

Теперь нужно сделать задержку в мс или как-то через delay_cycles. Делал так, не работает.

Код: Выделить всё

void Delay( unsigned int Val) {
  for( ; Val != 0; Val--) {
    __NOP();
  }
}

Delay( 100);
Как написать аналогично #define Pin7 PINA_Bit7, но только для STM.
Ответить

Вернуться в «ARM»