23.01.2011, 16:59
|
|
Заблокирован
Регистрация: 12.09.2009
Сообщений: 420
Сказал спасибо: 148
Сказали Спасибо 166 раз(а) в 118 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
помогите с первыми шагами. имеется стм32 дискавери и keil.
хочется поморгать светиком. открыл проект стартовый. там куча всяких #ifdef. разобраться в этом сложно. возможно ли запустить минуя все заготовки? (стартапы, системы) как эти все заготовки связаны? можно в один си файл запихнуть? чтоб самому все это прописать?
stm32f10x.h это описание регистров, не трогаем. цепляем к проекту и юзаем.
startup_stm32f10x_ld_vl.s это что?
system_stm32f10x.c настройка МК?
нашел http://eugenemcu.ru/publ/13-1-0-71 может кому пригодится.
сделал робкую попытку по созданию проекта While(1);
результат на фото. как быть? что упустил?
Последний раз редактировалось gromovi; 23.01.2011 в 17:16.
|
|
|
Сказали "Спасибо" gromovi
|
|
|
23.01.2011, 17:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,777
Сказал спасибо: 124
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от gromovi
|
что упустил?
|
system_stm32f10x.c
Сам долго искал и мучился. В нем есть функция начальной инициализации. Этого требует "startup_stm32f10x_md_vl.s" в процедуре "Reset_Handler PROC". Пробовал инициализацию делать в "STM32_Init.c", очень удобно, но в "STM32_Init.c" изменял название функции "stm32_Init" на "SystemInit". Удобно и легко, но мало периферии можно инициализировать.
|
|
|
Сказали "Спасибо" andries5
|
|
|
23.01.2011, 18:16
|
|
Заблокирован
Регистрация: 12.09.2009
Сообщений: 420
Сказал спасибо: 148
Сказали Спасибо 166 раз(а) в 118 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от andries5
|
system_stm32f10x.c
Сам долго искал и мучился. В нем есть функция начальной инициализации. Этого требует "startup_stm32f10x_md_vl.s" в процедуре "Reset_Handler PROC". Пробовал инициализацию делать в "STM32_Init.c", очень удобно, но в "STM32_Init.c" изменял название функции "stm32_Init" на "SystemInit". Удобно и легко, но мало периферии можно инициализировать.
|
допер и сам конечно. пользуя чужие коды светики зажег.
но понять что там делается в этой инициализации трудно.
вообще первое впечатление - кривизна во всем.
GPIOC-›BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BS9; этим зажигаем два светика
GPIOC-›BSRR=GPIO_BSRR_BR8|GPIO_BSRR_BS9; этим один зажигаем другой тушим.
НЕ ИНФОРМАТИВНО! куча писанины, нельзя ли как то более человекопонятно сделать? типо
порт на выход(регистр = чему то там)
двухтактный выход вкл.(регистр = чему то там)
порт.bit=1????
писец не вкурить на какой частоте работает мк после инициализации.
Код:
|
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC-›CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC-›CFGR &= (uint32_t)0xF8FF0000;
#else
RCC-›CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC-›CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC-›CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC-›CFGR &= (uint32_t)0xFF80FFFF;
#ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC-›CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC-›CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC-›CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
/* Disable all interrupts and clear pending bits */
RCC-›CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC-›CFGR2 = 0x00000000;
#else
/* Disable all interrupts and clear pending bits */
RCC-›CIR = 0x009F0000;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_HD) || (defined STM32F10X_XL)
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
#endif
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
}
/**
* @brief Update SystemCoreClock according to Clock Register Values
* @note None
* @param None
* @retval None
*/
void SystemCoreClockUpdate (void)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0;
#ifdef STM32F10X_CL
uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
uint32_t prediv1factor = 0;
#endif /* STM32F10X_LD_VL or STM32F10X_MD_VL */
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC-›CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI used as system clock */
SystemCoreClock = HSI_Value;
break;
case 0x04: /* HSE used as system clock */
SystemCoreClock = HSE_Value;
break;
case 0x08: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC-›CFGR & RCC_CFGR_PLLMULL;
pllsource = RCC-›CFGR & RCC_CFGR_PLLSRC;
#ifndef STM32F10X_CL
pllmull = ( pllmull ›› 18) + 2;
if (pllsource == 0x00)
{
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
SystemCoreClock = (HSI_Value ›› 1) * pllmull;
}
else
{
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
prediv1factor = (RCC-›CFGR2 & RCC_CFGR2_PREDIV1) + 1;
/* HSE oscillator clock selected as PREDIV1 clock entry */
SystemCoreClock = (HSE_Value / prediv1factor) * pllmull;
#else
/* HSE selected as PLL clock entry */
if ((RCC-›CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET)
{/* HSE oscillator clock divided by 2 */
SystemCoreClock = (HSE_Value ›› 1) * pllmull;
}
else
{
SystemCoreClock = HSE_Value * pllmull;
}
#endif
}
#else
pllmull = pllmull ›› 18;
if (pllmull != 0x0D)
{
pllmull += 2;
}
else
{ /* PLL multiplication factor = PLL input clock * 6.5 */
pllmull = 13 / 2;
}
if (pllsource == 0x00)
{
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
SystemCoreClock = (HSI_Value ›› 1) * pllmull;
}
else
{/* PREDIV1 selected as PLL clock entry */
/* Get PREDIV1 clock source and division factor */
prediv1source = RCC-›CFGR2 & RCC_CFGR2_PREDIV1SRC;
prediv1factor = (RCC-›CFGR2 & RCC_CFGR2_PREDIV1) + 1;
if (prediv1source == 0)
{
/* HSE oscillator clock selected as PREDIV1 clock entry */
SystemCoreClock = (HSE_Value / prediv1factor) * pllmull;
}
else
{/* PLL2 clock selected as PREDIV1 clock entry */
/* Get PREDIV2 division factor and PLL2 multiplication factor */
prediv2factor = ((RCC-›CFGR2 & RCC_CFGR2_PREDIV2) ›› 4) + 1;
pll2mull = ((RCC-›CFGR2 & RCC_CFGR2_PLL2MUL) ›› 8 ) + 2;
SystemCoreClock = (((HSE_Value / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
}
}
#endif /* STM32F10X_CL */
break;
default:
SystemCoreClock = HSI_Value;
break;
}
/* Compute HCLK clock frequency ----------------*/
/* Get HCLK prescaler */
tmp = AHBPrescTable[((RCC-›CFGR & RCC_CFGR_HPRE) ›› 4)];
/* HCLK clock frequency */
SystemCoreClock ››= tmp;
}
/**
* @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
* @param None
* @retval None
*/
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#endif
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
} |
Последний раз редактировалось gromovi; 23.01.2011 в 18:41.
|
|
|
|
23.01.2011, 18:16
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
andries5, По шагам распиши как с STM32_Init.c начать проект.
И где слить свежую .
Если не трудно.
__________________
Осторожно , злой кот
|
|
|
|
23.01.2011, 19:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,777
Сказал спасибо: 124
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
gromovi, сам не очень плаваю, но что понял расскажу.
В инициализации идет сброс и последующая установка. В "system_stm32f10x.c" указано
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#endif
т.е. установить 24MHz. Можно передефайнить на HSE то есть на 8MHz. Для более гибкого изменения надо применить свои процедуры для RCC. Но изменять множитель можно только при отключенном PLL. PLL это множитель системной частоты.
|
|
|
Сказали "Спасибо" andries5
|
|
|
23.01.2011, 19:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,777
Сказал спасибо: 124
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
dosikus, Создаю папку проекта например "Test", в нее копирую
STM32_Init.c
STM32_Init.h
STM32_Reg.h
далее в кейле создаю проект в данной папке. В ней же создаю "main.c"
#include "stm32f10x.h"
#include "STM32_Init.h"
#define Led_blue_off GPIOC-›BRR =GPIO_BRR_BR8
#define Led_blue_on GPIOC-›BSRR =GPIO_BSRR_BS8
#define Led_green_off GPIOC-›BRR =GPIO_BRR_BR9
#define Led_green_on GPIOC-›BSRR =GPIO_BSRR_BS9
#define Button_User GPIOA-›IDR & GPIO_IDR_IDR0
int main(void)
{
Led_green_on;
Led_blue_on;
while (1)
{
}
}
в "STM32_Init.c" в строке 5529 меняю имя функции "stm32_Init" на "SystemInit".
Когда открыт "STM32_Init.c" на вкладке его внизу есть "Configuration Wizard".
Нажимаю на ней и в данном мастере удобно настроить порты, частоту, таймеры (правда только четыре), RTC, wdg, USART. Компилирую и радуюсь как дитя. Для симуляции меняю имя процессора на stm32f103RB и тогда в симуляторе в периферии смотрю состояние и частоты и портов и чего угодно.
Но все-же видимо буду ломать голову над "STM32F10x_StdPeriph_Driver". Уже что-то вырисовывается.
|
|
|
Эти 3 пользователя(ей) сказали Спасибо andries5 за это сообщение:
|
|
|
23.01.2011, 20:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,777
Сказал спасибо: 124
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от gromovi
|
GPIOC-›BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BS9; этим зажигаем два светика
GPIOC-›BSRR=GPIO_BSRR_BR8|GPIO_BSRR_BS9; этим один зажигаем другой тушим.
НЕ ИНФОРМАТИВНО! куча писанины, нельзя ли как то более человекопонятно сделать? типо
порт на выход(регистр = чему то там)
|
Здесь сказано следующее:
GPIOC-›BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BS9;
В порт GPIOC т.е. в регистр портаС записать "установить единицу на 8, и ноль на 9 выходе порта"
GPIOC-›BSRR=GPIO_BSRR_BR8|GPIO_BSRR_BS9;
В порт GPIOC т.е. в регистр портаС записать "установить ноль на 8, и единицу на 9 выходе порта"
Сообщение от gromovi
|
писец не вкурить на какой частоте работает мк после инициализации.
|
уже писал выше "Для симуляции меняю имя процессора на stm32f103RB и тогда в симуляторе в периферии смотрю состояние и частоты и портов и чего угодно."
|
|
|
Эти 3 пользователя(ей) сказали Спасибо andries5 за это сообщение:
|
|
|
23.01.2011, 20:36
|
|
Заблокирован
Регистрация: 12.09.2009
Сообщений: 420
Сказал спасибо: 148
Сказали Спасибо 166 раз(а) в 118 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от andries5
|
GPIOC-›BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BS9;
В порт GPIOC т.е. в регистр портаС записать "установить единицу на 8, и ноль на 9 выходе порта"
|
8=1 && 9=1 || нет?
|
|
|
|
23.01.2011, 20:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,777
Сказал спасибо: 124
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от gromovi
|
GPIO_BSRR_BS8
|
Это битовая маска. То есть BS8 это восьмой бит регистра BSRR группы GPIO.
BS9 это девятый бит BSRR.
BR8 это двадцать четвертый бит того-же регистра. Просто BSRR 32-разрядный регистр поделен на две части, с 0 по 15 биты устанавливают бит в порту, а с 16 по 31 сего-же и сбрасывают. "Reference manual.pdf RM0041" страница 113. Все просто.
|
|
|
|
23.01.2011, 20:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,777
Сказал спасибо: 124
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от gromovi
|
8=1 && 9=1 || нет?
|
В данном случае да, установить 1 и на 8 и на 9. Порта С.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:02.
|
|