Про Keil uVision 5
Re: Про Keil uVision 5
Почему не так?
*(uint16_t ) (LCD_REG) = reg;
*(uint16_t ) (LCD_REG) = reg;
Re: Про Keil uVision 5
Потому что тогда (uint16_t)(LCD_REG) превратит значение адреса в двухбайтное целое число. Во-первых, адрес может быть числом как меньше 2 байт, так и больше, и в последнем случае мы его обрежем приведя к двухбайтному целому типу. Во-вторых, в Си нельзя разадресовать просто число, только какой-нибудь указатель. Такой вот уж стандарт языка, нету там простой конструкции "записать по адресу N", приходится по несколько раз приводить типы один к другому.
Re: Про Keil uVision 5
baghear, может так :
*(__IO uint16_t *) (LCD_REG) = reg;
__IO он же volatile.
*(__IO uint16_t *) (LCD_REG) = reg;
__IO он же volatile.
Иван Сусанин - первый полупроводник 
Re: Про Keil uVision 5
Ну все, совсем человека запутали. Он и так с указателями на вы, а тут еще какой-то __IO и volatile.
Re: Про Keil uVision 5
Спасибо, приму как должное
Re: Про Keil uVision 5
Что такое volatile в курсе, а вот что такое __IO?
Re: Про Keil uVision 5
Какое-нибудь макроопределение или typedef. Обычно производители вот так делают:
Тогда объявления регистров будут такими:
Пользоваться как обычными переменными:
Код: Выделить всё
typedef volatile uint8_t* __IO8;
typedef volatile uint16_t* __IO16;
typedef volatile uint32_t* __IO32;
Тогда объявления регистров будут такими:
Код: Выделить всё
#define REG_CON (*_IO16 (0xFFFFBBB0))
#define REG_STS (*_IO32 (0xFFFFBBB2))
#define REG_DBG (*_IO16 (0xFFFFBBB6))
Пользоваться как обычными переменными:
Код: Выделить всё
...
if (REG_STS == 0x25)
{
REG_CON |= 0xFA1;
}
...
Re: Про Keil uVision 5
Спасибо!!!
Re: Про Keil uVision 5
Добрый день, что означает такая запись ?
#define assert_param(expr) ((void)0)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
#define assert_param(expr) ((void)0)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
Re: Про Keil uVision 5
На самом деле ничего. Любой assert_param в коде независимо от его параметра заменяется на конструкцию ((void)0), которая ничего не делает и игнорируется компилятором. Вообще, assert - это такая штука, которая валит программу с сообщением об ошибке, если переданный ей параметр равен нулю, или false. При отладке это может помочь найти всякие ошибки, вроде неправильного использования функции. Например:
Когда программа отлажена и готова для выпуска, то все ассерты хорошо бы удалить, чтобы они не потребляли зря ресурсов. Шерстить все функции на их наличие не удобно, да и не всегда возможно, поэтому в файле, где объявлен assert (какой-нибудь assert.h), вводят конструкцию наподобие указанной тобой, чтобы все вызовы assert заменились препроцессором на нечто незначащее и были выкинуты компилятором. Вот так.
Код: Выделить всё
void Foo(int a)
{
// Программа аварийно завершиться, если мы передадим функции
// значение меньше ста или больше тысячи.
assert(a < 100);
assert(a > 1000);
...
}
Когда программа отлажена и готова для выпуска, то все ассерты хорошо бы удалить, чтобы они не потребляли зря ресурсов. Шерстить все функции на их наличие не удобно, да и не всегда возможно, поэтому в файле, где объявлен assert (какой-нибудь assert.h), вводят конструкцию наподобие указанной тобой, чтобы все вызовы assert заменились препроцессором на нечто незначащее и были выкинуты компилятором. Вот так.
Re: Про Keil uVision 5
Спасибо, а (void) 0 - приведение нуля к типу?
Re: Про Keil uVision 5
Да, если просто написать ноль, то компилятор возможно выдаст предупреждение о неиспользуемом значении, приведя его к void можно избежать этого. Лично я бы не стал использовать такую, несколько непривычную конструкцию для того, чтобы игнорировать вызов assert. По мне намного логичней выглядит такая запись:
то есть, "пустое" макроопределение. В этом случае препроцессор не будет заменять его на незначащую конструкцию, а просто выкинет и все. Хотя, это дело вкуса.
Код: Выделить всё
#define assert(expr)то есть, "пустое" макроопределение. В этом случае препроцессор не будет заменять его на незначащую конструкцию, а просто выкинет и все. Хотя, это дело вкуса.
Re: Про Keil uVision 5
Большое спасибо
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Про Keil uVision 5
Народ,подскажите пожалуйста.
Разбираюсь с lwIP стеком. Скачал пример с сайта st. В дереве проекта напротив двух файлов 3 вертикальных красных квадратика. Что это такое? Не разу не сталкивался. Это влияет на процесс компиляции?
Разбираюсь с lwIP стеком. Скачал пример с сайта st. В дереве проекта напротив двух файлов 3 вертикальных красных квадратика. Что это такое? Не разу не сталкивался. Это влияет на процесс компиляции?
- Вложения
-
- keil.jpg
- (140.69 КБ) 520 скачиваний
Re: Про Keil uVision 5
Это значит что настройки компиляции для этих файлов изменены и при компиляции будут задействованы именно они а не общие для проекта.
Клик правой кнопкой по этим файлам в менеджере проекта -> Options for file 'xxx' и смотри изменения ...
Клик правой кнопкой по этим файлам в менеджере проекта -> Options for file 'xxx' и смотри изменения ...
-
GHOST_J_D
- Родился
- Сообщения: 12
- Зарегистрирован: Пт дек 14, 2012 21:07:49
- Откуда: Екатеринбург
- Контактная информация:
Re: Про Keil uVision 5
Разбираюся с примером 3 отсюда http://radiokot.ru/articles/43/ плата влдешная, кейл5 выдает такую ошибку source\STM32_init\STM32_Init.c(31): error: #5: cannot open source input file "stm32f10x_lib.h": No such file or directory
#include "stm32f10x_lib.h" // STM32F10x Library Definitions
Скачивал новые библиотеки https://translate.googleusercontent.com ... pNpmO5EEiQ заменял файлы из примера на них, всеравно выдает тоже самое, в 3, 4, и 5 примерах.
Куда копать
подскажите пожалуйста.
#include "stm32f10x_lib.h" // STM32F10x Library Definitions
Скачивал новые библиотеки https://translate.googleusercontent.com ... pNpmO5EEiQ заменял файлы из примера на них, всеравно выдает тоже самое, в 3, 4, и 5 примерах.
Куда копать
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Про Keil uVision 5
пробуйте #include "stm32f10x.h"
#include "stm32f10x_lib.h" похоже было в старых библиотеках (V2.x).
Лучше разбирать примеры от производителя (имхо).
#include "stm32f10x_lib.h" похоже было в старых библиотеках (V2.x).
Лучше разбирать примеры от производителя (имхо).
-
GHOST_J_D
- Родился
- Сообщения: 12
- Зарегистрирован: Пт дек 14, 2012 21:07:49
- Откуда: Екатеринбург
- Контактная информация:
Re: Про Keil uVision 5
Переподключил в файле INIT.c
Начал компилить исходник.Но выдает 39 варнингов source\STM32_init\STM32_Reg.h(38): warning: #47-D: incompatible redefinition of macro "PWR_CR_DBP" (declared at line 1517 of ".\source\config\stm32f10x.h") такого плана.
Может ктонибуть тыкнуть в рвбочие примеры. Заводские примеры stm32vldiscovery_package уже скачал.
Начал компилить исходник.Но выдает 39 варнингов source\STM32_init\STM32_Reg.h(38): warning: #47-D: incompatible redefinition of macro "PWR_CR_DBP" (declared at line 1517 of ".\source\config\stm32f10x.h") такого плана.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Про Keil uVision 5
В библиотеке STM32F10x standard peripheral library полно примеров, практически для всех "внутренностей" микроконтроллеров этой линейки:
STM32F10x StdPeriph_Lib Examples
The package contains the following examples:
ADC - BKP - CAN - CEC - CortexM3 - CRC - DAC - DMA - EXTI - FLASH - FSMC - GPIO - I2C - I2S - IWDG - Lib_DEBUG - NVIC - PWR - RCC - RTC - SDIO - SPI - SysTick - TIM - USART - WWDG
Так же есть готовые шаблоны для проектов IAR, Keil, Atolic TrueSTUDIO
STM32F10x StdPeriph_Lib Examples
The package contains the following examples:
ADC - BKP - CAN - CEC - CortexM3 - CRC - DAC - DMA - EXTI - FLASH - FSMC - GPIO - I2C - I2S - IWDG - Lib_DEBUG - NVIC - PWR - RCC - RTC - SDIO - SPI - SysTick - TIM - USART - WWDG
Так же есть готовые шаблоны для проектов IAR, Keil, Atolic TrueSTUDIO
Re: Про Keil uVision 5
Добрый день, подскажите почему программа не заходит в прерывание?
#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC
int main(void)
{
RCC_HSICmd(ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
TIM4->PSC = 8000;
TIM4->ARR = 1000;
TIM4->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ (TIM4_IRQn);
TIM4->CR1 |= TIM_CR1_CEN;
__enable_irq ();
while(1)
{
}
}
void TIM4_IRQnHandler(void)
{
TIM4->SR &= ~TIM_SR_UIF;
}
Есть ли в keil флаг глобального разрешения прерываний, где его посмотреть?
Хотелось бы понять выполняется ли команда __enable_irq ();
Спойлер
#include "stm32f10x.h" // Device header#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC
int main(void)
{
RCC_HSICmd(ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
TIM4->PSC = 8000;
TIM4->ARR = 1000;
TIM4->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ (TIM4_IRQn);
TIM4->CR1 |= TIM_CR1_CEN;
__enable_irq ();
while(1)
{
}
}
void TIM4_IRQnHandler(void)
{
TIM4->SR &= ~TIM_SR_UIF;
}
Есть ли в keil флаг глобального разрешения прерываний, где его посмотреть?
Хотелось бы понять выполняется ли команда __enable_irq ();
Последний раз редактировалось baghear Чт окт 30, 2014 20:57:27, всего редактировалось 2 раза.