Алгоритмы определения функции arctg различными методами
Страницы
▼
Страницы
▼
среда, 18 февраля 2015 г.
понедельник, 16 февраля 2015 г.
RCC STM32F1
Контроллеры STM32 обладают достаточно развитой системой тактирования, включающей кучу различных делителей, умножителей и селекторов, которые позволяют "разогнать" до 72 МГц частоту ядра и системной шины, а также организовать тактирование на различных частотах всех входящих в состав контроллера модулей (USB, I/O, I2C, SPI...).
При этом стартует контроллер всегда от внутреннего генератора на 8 МГц, а дальнейший "разгон" и настройка тактирования различных модулей выполняется программно.
Все регистры, отвечающие за настройку системы тактирования сгруппированы в так называемый блок RCC (reset and clock control). Это десять 32-х битных регистров, доступных в памяти начиная с адреса 0x40021000, названия которых начинаются с "RCC_".
Настройку системы тактирования можно разделить на два этапа. На первом этапе настраивается системная тактовая частота. На втором этапе - частота системной шины AHB и подключенные к шине AHB модули. Отдельно от этих двух этапов можно настроить низкоскоростные генераторы для часов реального времени и независимого "собачьего таймера".
При этом стартует контроллер всегда от внутреннего генератора на 8 МГц, а дальнейший "разгон" и настройка тактирования различных модулей выполняется программно.
Все регистры, отвечающие за настройку системы тактирования сгруппированы в так называемый блок RCC (reset and clock control). Это десять 32-х битных регистров, доступных в памяти начиная с адреса 0x40021000, названия которых начинаются с "RCC_".
Настройку системы тактирования можно разделить на два этапа. На первом этапе настраивается системная тактовая частота. На втором этапе - частота системной шины AHB и подключенные к шине AHB модули. Отдельно от этих двух этапов можно настроить низкоскоростные генераторы для часов реального времени и независимого "собачьего таймера".
суббота, 14 февраля 2015 г.
STM32 Assembler routine sqrt modul
Функция подсчета модуля вектора (квадрат модуля не должен превышать 32 бита)
AREA |.text|, CODE, READONLY
sqrt_32 PROC
EXPORT sqrt_32 [WEAK]
MUL R0,R0,R0
MUL R1,R1,R1
ADD R0,R0,R1
; Optimised 32-bit integer sqrt
; INPUT
; Calculates square root of R0
; OUTPUT
; Result returned in R0
AREA |.text|, CODE, READONLY
sqrt_32 PROC
EXPORT sqrt_32 [WEAK]
MUL R0,R0,R0
MUL R1,R1,R1
ADD R0,R0,R1
; Optimised 32-bit integer sqrt
; INPUT
; Calculates square root of R0
; OUTPUT
; Result returned in R0
воскресенье, 8 февраля 2015 г.
среда, 4 февраля 2015 г.
CMSIS DSP Library: arm_sqrt_q15
Определение функции:
arm_status arm_sqrt_q15(q15_t in, q15_t * pOut)
q15 - формат с фиксированной точкой 1.15 в котором 0 представлен как 0х0000, а 1 представлена как 0х7FFF. Это значит, что например 1/2 будет представлена в формате 0х4000, а 1/4 как 0х2000. Функция возвращает статус ARM_MATH_SUCCESS или ARM_MATH_ARGUMENT_ERROR. Результат функция возвращает по ссылке pOut. Результат представлен также в формате q15. Например
arm_sqrt_q15(0x1000,&out);
0х1000 является представлением в формате q15 числа 1/8 или 0.125. Корень квадратный sqrt(0.125)=0.3536. Функция дает результат 0х2D42 = 11586/2^15 = 0,3536. Время выполнения функции для 32F103 @72MHz - 244 такта (3,39 mks).
Аналогичным образом используется и более точная функция:
arm_sqrt_q31(q31_t in, q31_t * pOut);
Ее время выполнения функции для 32F103 @72MHz - 286 тактов (3,97 mks).
Для плавающей точки:
arm_sqrt_f32(float32_t in, float32_t * pOut);
Время выполнения функции для 32F103 @72MHz - 544 такта (7,56 mks).
Указанное время выполнения функций были определены для версии V1.4.4 библиотеки CMSIS DSP (Date: 12. March 2014), которая идентична предыдущим версиям V1.4.3, V1.4.2, и V1.4.1.
Для справки: при использовании стандартной библиотеки Си math.h для различных типов переменных получим примерно такие (в зависимости от аргумента) времена выполнения функций в тактах
float sqrtf(float) ~ 575
double sqrt(double) ~ 2640
arm_status arm_sqrt_q15(q15_t in, q15_t * pOut)
q15 - формат с фиксированной точкой 1.15 в котором 0 представлен как 0х0000, а 1 представлена как 0х7FFF. Это значит, что например 1/2 будет представлена в формате 0х4000, а 1/4 как 0х2000. Функция возвращает статус ARM_MATH_SUCCESS или ARM_MATH_ARGUMENT_ERROR. Результат функция возвращает по ссылке pOut. Результат представлен также в формате q15. Например
arm_sqrt_q15(0x1000,&out);
0х1000 является представлением в формате q15 числа 1/8 или 0.125. Корень квадратный sqrt(0.125)=0.3536. Функция дает результат 0х2D42 = 11586/2^15 = 0,3536. Время выполнения функции для 32F103 @72MHz - 244 такта (3,39 mks).
Аналогичным образом используется и более точная функция:
arm_sqrt_q31(q31_t in, q31_t * pOut);
Ее время выполнения функции для 32F103 @72MHz - 286 тактов (3,97 mks).
Для плавающей точки:
arm_sqrt_f32(float32_t in, float32_t * pOut);
Время выполнения функции для 32F103 @72MHz - 544 такта (7,56 mks).
Указанное время выполнения функций были определены для версии V1.4.4 библиотеки CMSIS DSP (Date: 12. March 2014), которая идентична предыдущим версиям V1.4.3, V1.4.2, и V1.4.1.
Для справки: при использовании стандартной библиотеки Си math.h для различных типов переменных получим примерно такие (в зависимости от аргумента) времена выполнения функций в тактах
float sqrtf(float) ~ 575
double sqrt(double) ~ 2640