增加了屏幕显示的封装驱动,日志输出,电机挡位控制

This commit is contained in:
2026-02-05 13:06:01 +08:00
parent 22380b09a1
commit f275a5aad9
194 changed files with 65750 additions and 45 deletions

22
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,22 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "stlinkgdbtarget",
"request": "launch",
"name": "STM32Cube: STM32 Launch ST-Link GDB Server",
"origin": "snippet",
"cwd": "${workspaceFolder}",
"preBuild": "${command:st-stm32-ide-debug-launch.build}",
"runEntry": "main",
"imagesAndSymbols": [
{
"imageFileName": "${command:st-stm32-ide-debug-launch.get-projects-binary-from-context1}"
}
]
}
]
}

17
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "cmake",
"label": "CMake: 清理重新生成",
"command": "cleanRebuild",
"targets": [
"all"
],
"preset": "Debug",
"group": "build",
"problemMatcher": [],
"detail": "CMake 模板 清理重新生成 任务"
}
]
}

View File

@@ -45,11 +45,17 @@ target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here
Core/Src/easylogger/src/elog.c
Core/Src/easylogger/src/elog_utils.c
Core/Src/easylogger/port/elog_port.c
Core/Src/motor_driver.c
Core/Src/screen.c
)
# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths
Core/Src/easylogger/inc
)
# Add project symbols (macros)
@@ -66,3 +72,8 @@ target_link_libraries(${CMAKE_PROJECT_NAME}
# Add user defined libraries
)
# Enable float support for printf
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
-u _printf_float
)

View File

@@ -64,7 +64,7 @@
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 56 )
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
#define configTOTAL_HEAP_SIZE ((size_t)3072)
#define configTOTAL_HEAP_SIZE ((size_t)15000)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0

View File

@@ -57,6 +57,8 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define HOT_Pin GPIO_PIN_1
#define HOT_GPIO_Port GPIOA
#define RUN_LED_Pin GPIO_PIN_12
#define RUN_LED_GPIO_Port GPIOB
#define ERR_LED_Pin GPIO_PIN_13

73
Core/Inc/screen.h Normal file
View File

@@ -0,0 +1,73 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file screen.h
* @brief 串口屏驱动接口(用于 JC 系列串口屏,使用 USART1
******************************************************************************
*/
/* USER CODE END Header */
#ifndef __SCREEN_H__
#define __SCREEN_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/**
* @brief 发送原始命令字符串到屏幕(阻塞直到发送完成)
* @param cmd C 字符串,命令应以";\r\n"结尾
* @return 0 成功, 负值 错误
*/
int Screen_SendCmd(const char *cmd);
/* 常用封装 - 简短说明见各函数 */
/** 清屏layer: 要清除的层号通常为0 */
void Screen_Clear(uint8_t layer);
/** 按地址显示图片addr 为闪存地址) */
void Screen_DisplayImage(uint32_t addr);
/** 设置背光val: 0 最亮255 最暗 */
void Screen_SetBrightness(uint8_t val);
/** 绘制 16 字号文本(不带背景) */
void Screen_DrawText16(uint16_t x, uint16_t y, const char *text, uint8_t color);
/* 额外封装命令 */
void Screen_SetRotation(uint8_t dir);
void Screen_SetBaud(uint32_t baud);
void Screen_DisplayImageAtAddr(uint32_t addr, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t mode);
void Screen_DisplayImageByIndex(uint32_t index, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t mode);
void Screen_Pixel(uint16_t x, uint16_t y, uint8_t color);
void Screen_Line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color);
void Screen_Box(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color);
void Screen_BoxFill(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color);
void Screen_Circle(uint16_t x, uint16_t y, uint16_t r, uint8_t color);
void Screen_CircleFill(uint16_t x, uint16_t y, uint16_t r, uint8_t color);
void Screen_SetBGColor(uint8_t color);
/* 带/不带背景的文本 */
void Screen_DrawText16V(uint16_t x, uint16_t y, const char *text, uint8_t color);
void Screen_DrawText24(uint16_t x, uint16_t y, const char *text, uint8_t color);
void Screen_DrawText24V(uint16_t x, uint16_t y, const char *text, uint8_t color);
void Screen_DrawText32(uint16_t x, uint16_t y, const char *text, uint8_t color);
void Screen_DrawText32V(uint16_t x, uint16_t y, const char *text, uint8_t color);
void Screen_DrawText48(uint16_t x, uint16_t y, const char *text, uint8_t color, uint8_t transparent);
/* Button */
void Screen_Button(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const char *label, uint8_t fontColor, uint8_t bgColor, uint8_t pressFlag, uint8_t style);
/* Qrcode */
void Screen_QRCode(uint16_t x, uint16_t y, const char *url);
void Screen_QRCodeEx(uint16_t x, uint16_t y, const char *url, uint16_t size, uint8_t color);
/* 版本信息 */
void Screen_Ver(void);
#ifdef __cplusplus
}
#endif
#endif /* __SCREEN_H__ */

View File

@@ -44,7 +44,7 @@ void MX_ADC1_Init(void)
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
@@ -58,7 +58,7 @@ void MX_ADC1_Init(void)
*/
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();

View File

@@ -0,0 +1,272 @@
//
// Created by wangb on 25-6-4.
//
#ifndef ELOG_H
#define ELOG_H
#include "elog_cfg.h"
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/* output log's level */
#define ELOG_LVL_ASSERT 0
#define ELOG_LVL_ERROR 1
#define ELOG_LVL_WARN 2
#define ELOG_LVL_INFO 3
#define ELOG_LVL_DEBUG 4
#define ELOG_LVL_VERBOSE 5
/* the output silent level and all level for filter setting */
#define ELOG_FILTER_LVL_SILENT ELOG_LVL_ASSERT
#define ELOG_FILTER_LVL_ALL ELOG_LVL_VERBOSE
/* output log's level total number */
#define ELOG_LVL_TOTAL_NUM 6
/* EasyLogger software version number */
#define ELOG_SW_VERSION "2.2.99"
/* EasyLogger assert for developer. */
#ifdef ELOG_ASSERT_ENABLE
#define ELOG_ASSERT(EXPR) \
if (!(EXPR)) \
{ \
if (elog_assert_hook == NULL) { \
elog_a("elog", "(%s) has assert failed at %s:%ld.", #EXPR, __FUNCTION__, __LINE__); \
while (1); \
} else { \
elog_assert_hook(#EXPR, __FUNCTION__, __LINE__); \
} \
}
#else
#define ELOG_ASSERT(EXPR) ((void)0);
#endif
#ifndef ELOG_OUTPUT_ENABLE
#define elog_raw(...)
#define elog_assert(tag, ...)
#define elog_error(tag, ...)
#define elog_warn(tag, ...)
#define elog_info(tag, ...)
#define elog_debug(tag, ...)
#define elog_verbose(tag, ...)
#else /* ELOG_OUTPUT_ENABLE */
#ifdef ELOG_FMT_USING_FUNC
#define ELOG_OUTPUT_FUNC __FUNCTION__
#else
#define ELOG_OUTPUT_FUNC NULL
#endif
#ifdef ELOG_FMT_USING_DIR
#define ELOG_OUTPUT_DIR __FILE__
#else
#define ELOG_OUTPUT_DIR NULL
#endif
#ifdef ELOG_FMT_USING_LINE
#define ELOG_OUTPUT_LINE __LINE__
#else
#define ELOG_OUTPUT_LINE 0
#endif
#define elog_raw(...) elog_raw_output(__VA_ARGS__)
#if ELOG_OUTPUT_LVL >= ELOG_LVL_ASSERT
#define elog_assert(tag, ...) \
elog_output(ELOG_LVL_ASSERT, tag, ELOG_OUTPUT_DIR, ELOG_OUTPUT_FUNC, ELOG_OUTPUT_LINE, __VA_ARGS__)
#else
#define elog_assert(tag, ...)
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_ASSERT */
#if ELOG_OUTPUT_LVL >= ELOG_LVL_ERROR
#define elog_error(tag, ...) \
elog_output(ELOG_LVL_ERROR, tag, ELOG_OUTPUT_DIR, ELOG_OUTPUT_FUNC, ELOG_OUTPUT_LINE, __VA_ARGS__)
#else
#define elog_error(tag, ...)
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_ERROR */
#if ELOG_OUTPUT_LVL >= ELOG_LVL_WARN
#define elog_warn(tag, ...) \
elog_output(ELOG_LVL_WARN, tag, ELOG_OUTPUT_DIR, ELOG_OUTPUT_FUNC, ELOG_OUTPUT_LINE, __VA_ARGS__)
#else
#define elog_warn(tag, ...)
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_WARN */
#if ELOG_OUTPUT_LVL >= ELOG_LVL_INFO
#define elog_info(tag, ...) \
elog_output(ELOG_LVL_INFO, tag, ELOG_OUTPUT_DIR, ELOG_OUTPUT_FUNC, ELOG_OUTPUT_LINE, __VA_ARGS__)
#else
#define elog_info(tag, ...)
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_INFO */
#if ELOG_OUTPUT_LVL >= ELOG_LVL_DEBUG
#define elog_debug(tag, ...) \
elog_output(ELOG_LVL_DEBUG, tag, ELOG_OUTPUT_DIR, ELOG_OUTPUT_FUNC, ELOG_OUTPUT_LINE, __VA_ARGS__)
#else
#define elog_debug(tag, ...)
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_DEBUG */
#if ELOG_OUTPUT_LVL == ELOG_LVL_VERBOSE
#define elog_verbose(tag, ...) \
elog_output(ELOG_LVL_VERBOSE, tag, ELOG_OUTPUT_DIR, ELOG_OUTPUT_FUNC, ELOG_OUTPUT_LINE, __VA_ARGS__)
#else
#define elog_verbose(tag, ...)
#endif /* ELOG_OUTPUT_LVL == ELOG_LVL_VERBOSE */
#endif /* ELOG_OUTPUT_ENABLE */
/* all formats index */
typedef enum {
ELOG_FMT_LVL = 1 << 0, /**< level */
ELOG_FMT_TAG = 1 << 1, /**< tag */
ELOG_FMT_TIME = 1 << 2, /**< current time */
ELOG_FMT_P_INFO = 1 << 3, /**< process info */
ELOG_FMT_T_INFO = 1 << 4, /**< thread info */
ELOG_FMT_DIR = 1 << 5, /**< file directory and name */
ELOG_FMT_FUNC = 1 << 6, /**< function name */
ELOG_FMT_LINE = 1 << 7, /**< line number */
} ElogFmtIndex;
/* macro definition for all formats */
#define ELOG_FMT_ALL (ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_TIME|ELOG_FMT_P_INFO|ELOG_FMT_T_INFO| \
ELOG_FMT_DIR|ELOG_FMT_FUNC|ELOG_FMT_LINE)
/* output log's tag filter */
typedef struct {
uint8_t level;
char tag[ELOG_FILTER_TAG_MAX_LEN + 1];
bool tag_use_flag; /**< false : tag is no used true: tag is used */
} ElogTagLvlFilter, *ElogTagLvlFilter_t;
/* output log's filter */
typedef struct {
uint8_t level;
char tag[ELOG_FILTER_TAG_MAX_LEN + 1];
char keyword[ELOG_FILTER_KW_MAX_LEN + 1];
ElogTagLvlFilter tag_lvl[ELOG_FILTER_TAG_LVL_MAX_NUM];
} ElogFilter, *ElogFilter_t;
/* easy logger */
typedef struct {
ElogFilter filter;
size_t enabled_fmt_set[ELOG_LVL_TOTAL_NUM];
bool init_ok;
bool output_enabled;
bool output_lock_enabled;
bool output_is_locked_before_enable;
bool output_is_locked_before_disable;
#ifdef ELOG_COLOR_ENABLE
bool text_color_enabled;
#endif
}EasyLogger, *EasyLogger_t;
/* EasyLogger error code */
typedef enum {
ELOG_NO_ERR,
} ElogErrCode;
/* elog.c */
ElogErrCode elog_init(void);
void elog_deinit(void);
void elog_start(void);
void elog_stop(void);
void elog_set_output_enabled(bool enabled);
bool elog_get_output_enabled(void);
void elog_set_text_color_enabled(bool enabled);
bool elog_get_text_color_enabled(void);
void elog_set_fmt(uint8_t level, size_t set);
void elog_set_filter(uint8_t level, const char *tag, const char *keyword);
void elog_set_filter_lvl(uint8_t level);
void elog_set_filter_tag(const char *tag);
void elog_set_filter_kw(const char *keyword);
void elog_set_filter_tag_lvl(const char *tag, uint8_t level);
uint8_t elog_get_filter_tag_lvl(const char *tag);
void elog_raw_output(const char *format, ...);
void elog_output(uint8_t level, const char *tag, const char *file, const char *func,
const long line, const char *format, ...);
void elog_output_lock_enabled(bool enabled);
extern void (*elog_assert_hook)(const char* expr, const char* func, size_t line);
void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line));
int8_t elog_find_lvl(const char *log);
const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len);
void elog_hexdump(const char *name, uint8_t width, const void *buf, uint16_t size);
#define elog_a(tag, ...) elog_assert(tag, __VA_ARGS__)
#define elog_e(tag, ...) elog_error(tag, __VA_ARGS__)
#define elog_w(tag, ...) elog_warn(tag, __VA_ARGS__)
#define elog_i(tag, ...) elog_info(tag, __VA_ARGS__)
#define elog_d(tag, ...) elog_debug(tag, __VA_ARGS__)
#define elog_v(tag, ...) elog_verbose(tag, __VA_ARGS__)
/**
* log API short definition
* NOTE: The `LOG_TAG` and `LOG_LVL` must defined before including the <elog.h> when you want to use log_x API.
*/
#if !defined(LOG_TAG)
#define LOG_TAG "NO_TAG"
#endif
#if !defined(LOG_LVL)
#define LOG_LVL ELOG_LVL_VERBOSE
#endif
#if LOG_LVL >= ELOG_LVL_ASSERT
#define log_a(...) elog_a(LOG_TAG, __VA_ARGS__)
#else
#define log_a(...) ((void)0);
#endif
#if LOG_LVL >= ELOG_LVL_ERROR
#define log_e(...) elog_e(LOG_TAG, __VA_ARGS__)
#else
#define log_e(...) ((void)0);
#endif
#if LOG_LVL >= ELOG_LVL_WARN
#define log_w(...) elog_w(LOG_TAG, __VA_ARGS__)
#else
#define log_w(...) ((void)0);
#endif
#if LOG_LVL >= ELOG_LVL_INFO
#define log_i(...) elog_i(LOG_TAG, __VA_ARGS__)
#else
#define log_i(...) ((void)0);
#endif
#if LOG_LVL >= ELOG_LVL_DEBUG
#define log_d(...) elog_d(LOG_TAG, __VA_ARGS__)
#else
#define log_d(...) ((void)0);
#endif
#if LOG_LVL >= ELOG_LVL_VERBOSE
#define log_v(...) elog_v(LOG_TAG, __VA_ARGS__)
#else
#define log_v(...) ((void)0);
#endif
/* assert API short definition */
#if !defined(assert)
#define assert ELOG_ASSERT
#endif
/* elog_buf.c */
void elog_buf_enabled(bool enabled);
void elog_flush(void);
/* elog_async.c */
void elog_async_enabled(bool enabled);
size_t elog_async_get_log(char *log, size_t size);
size_t elog_async_get_line_log(char *log, size_t size);
/* elog_utils.c */
size_t elog_strcpy(size_t cur_len, char *dst, const char *src);
size_t elog_cpyln(char *line, const char *log, size_t len);
void *elog_memcpy(void *dst, const void *src, size_t count);
void easylogger_init(void);
#ifdef __cplusplus
}
#endif
#endif //ELOG_H

View File

@@ -0,0 +1,59 @@
//
// Created by wangb on 25-6-4.
//
#ifndef _ELOG_CFG_H_
#define _ELOG_CFG_H_
/*---------------------------------------------------------------------------*/
/* enable log output. */
#define ELOG_OUTPUT_ENABLE
/* setting static output log level. range: from ELOG_LVL_ASSERT to ELOG_LVL_VERBOSE */
#define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE
/* enable assert check */
#define ELOG_ASSERT_ENABLE
/* buffer size for every line's log */
#define ELOG_LINE_BUF_SIZE 1024
/* output line number max length */
#define ELOG_LINE_NUM_MAX_LEN 5
/* output filter's tag max length */
#define ELOG_FILTER_TAG_MAX_LEN 30
/* output filter's keyword max length */
#define ELOG_FILTER_KW_MAX_LEN 16
/* output filter's tag level max num */
#define ELOG_FILTER_TAG_LVL_MAX_NUM 5
/* output newline sign */
#define ELOG_NEWLINE_SIGN "\r\n" //换行
/*---------------------------------------------------------------------------*/
/* enable log color */
#define ELOG_COLOR_ENABLE
/* change the some level logs to not default color if you want */
#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL)
#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL)
#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL)
#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL)
#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL)
#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL)
/*---------------------------------------------------------------------------*/
/* enable log fmt */
/* comment it if you don't want to output them at all */
#define ELOG_FMT_USING_FUNC
#define ELOG_FMT_USING_DIR
#define ELOG_FMT_USING_LINE
/*---------------------------------------------------------------------------*/
/* enable asynchronous output mode */
//#define ELOG_ASYNC_OUTPUT_ENABLE
/* the highest output level for async mode, other level will sync output */
#define ELOG_ASYNC_OUTPUT_LVL ELOG_LVL_ASSERT
/* buffer size for asynchronous output mode */
#define ELOG_ASYNC_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
/* each asynchronous output's log which must end with newline sign */
#define ELOG_ASYNC_LINE_OUTPUT
/* asynchronous output mode using POSIX pthread implementation */
#define ELOG_ASYNC_OUTPUT_USING_PTHREAD
/*---------------------------------------------------------------------------*/
/* enable buffered output mode */
//#define ELOG_BUF_OUTPUT_ENABLE
/* buffer size for buffered output mode */
#define ELOG_BUF_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
#endif /* _ELOG_CFG_H_ */

View File

@@ -0,0 +1,114 @@
//
// Created by wangb on 25-6-4.
//
#include "elog.h"
#include <stdio.h>
#include "main.h"
/**
* EasyLogger port initialize
*
* @return result
*/
ElogErrCode elog_port_init(void) {
ElogErrCode result = ELOG_NO_ERR;
/* add your code here */
return result;
}
/**
* EasyLogger port deinitialize
*
*/
void elog_port_deinit(void) {
/* add your code here */
}
/**
* output log port interface
*
* @param log output of log
* @param size log size
*/
void elog_port_output(const char *log, size_t size) {
/* add your code here */
printf("%.*s", size, log); //elog 的输出
}
/**
* output lock
*/
void elog_port_output_lock(void) {
/* add your code here */
__disable_irq(); //关闭全局中断
}
/**
* output unlock
*/
void elog_port_output_unlock(void) {
/* add your code here */
__enable_irq(); //开启全局中断
}
#include <stdio.h>
/**
* get current time interface
*
* @return current time
*/
const char *elog_port_get_time(void) {
return "";
}
/**
* get current process name interface
*
* @return current process name
*/
const char *elog_port_get_p_info(void) {
/* add your code here */
return "";
}
/**
* get current thread name interface
*
* @return current thread name
*/
const char *elog_port_get_t_info(void) {
/* add your code here */
//获取STM32 的线程接口
return "";
}
void easylogger_init(void) {
/* init Easylogger */
elog_init();
/* set EasyLogger log format */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL & ~ELOG_FMT_P_INFO);
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_P_INFO));
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_P_INFO));
/* start EasyLogger */
elog_start();
}

View File

@@ -0,0 +1,912 @@
//
// Created by wangb on 25-6-4.
//
#define LOG_TAG "elog"
#include "elog.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#if !defined(ELOG_OUTPUT_LVL)
#error "Please configure static output log level (in elog_cfg.h)"
#endif
#if !defined(ELOG_LINE_NUM_MAX_LEN)
#error "Please configure output line number max length (in elog_cfg.h)"
#endif
#if !defined(ELOG_LINE_BUF_SIZE)
#error "Please configure buffer size for every line's log (in elog_cfg.h)"
#endif
#if !defined(ELOG_FILTER_TAG_MAX_LEN)
#error "Please configure output filter's tag max length (in elog_cfg.h)"
#endif
#if !defined(ELOG_FILTER_KW_MAX_LEN)
#error "Please configure output filter's keyword max length (in elog_cfg.h)"
#endif
#if !defined(ELOG_NEWLINE_SIGN)
#error "Please configure output newline sign (in elog_cfg.h)"
#endif
/* output filter's tag level max num */
#ifndef ELOG_FILTER_TAG_LVL_MAX_NUM
#define ELOG_FILTER_TAG_LVL_MAX_NUM 4
#endif
#ifdef ELOG_COLOR_ENABLE
/**
* CSI(Control Sequence Introducer/Initiator) sign
* more information on https://en.wikipedia.org/wiki/ANSI_escape_code
*/
#define CSI_START "\033["
#define CSI_END "\033[0m"
/* output log front color */
#define F_BLACK "30;"
#define F_RED "31;"
#define F_GREEN "32;"
#define F_YELLOW "33;"
#define F_BLUE "34;"
#define F_MAGENTA "35;"
#define F_CYAN "36;"
#define F_WHITE "37;"
/* output log background color */
#define B_NULL
#define B_BLACK "40;"
#define B_RED "41;"
#define B_GREEN "42;"
#define B_YELLOW "43;"
#define B_BLUE "44;"
#define B_MAGENTA "45;"
#define B_CYAN "46;"
#define B_WHITE "47;"
/* output log fonts style */
#define S_BOLD "1m"
#define S_UNDERLINE "4m"
#define S_BLINK "5m"
#define S_NORMAL "22m"
/* output log default color definition: [front color] + [background color] + [show style] */
#ifndef ELOG_COLOR_ASSERT
#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL)
#endif
#ifndef ELOG_COLOR_ERROR
#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL)
#endif
#ifndef ELOG_COLOR_WARN
#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL)
#endif
#ifndef ELOG_COLOR_INFO
#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL)
#endif
#ifndef ELOG_COLOR_DEBUG
#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL)
#endif
#ifndef ELOG_COLOR_VERBOSE
#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL)
#endif
#endif /* ELOG_COLOR_ENABLE */
/* EasyLogger object */
static EasyLogger elog;
/* every line log's buffer */
static char log_buf[ELOG_LINE_BUF_SIZE] = { 0 };
/* level output info */
static const char *level_output_info[] = {
[ELOG_LVL_ASSERT] = "ASSERT/",
[ELOG_LVL_ERROR] = "ERROR/",
[ELOG_LVL_WARN] = "WARN/",
[ELOG_LVL_INFO] = "INFO/",
[ELOG_LVL_DEBUG] = "DEBUG/",
[ELOG_LVL_VERBOSE] = "VERBOS/",
};
#ifdef ELOG_COLOR_ENABLE
/* color output info */
static const char *color_output_info[] = {
[ELOG_LVL_ASSERT] = ELOG_COLOR_ASSERT,
[ELOG_LVL_ERROR] = ELOG_COLOR_ERROR,
[ELOG_LVL_WARN] = ELOG_COLOR_WARN,
[ELOG_LVL_INFO] = ELOG_COLOR_INFO,
[ELOG_LVL_DEBUG] = ELOG_COLOR_DEBUG,
[ELOG_LVL_VERBOSE] = ELOG_COLOR_VERBOSE,
};
#endif /* ELOG_COLOR_ENABLE */
static bool get_fmt_enabled(uint8_t level, size_t set);
static bool get_fmt_used_and_enabled_u32(uint8_t level, size_t set, uint32_t arg);
static bool get_fmt_used_and_enabled_ptr(uint8_t level, size_t set, const char* arg);
static void elog_set_filter_tag_lvl_default(void);
/* EasyLogger assert hook */
void (*elog_assert_hook)(const char* expr, const char* func, size_t line);
extern void elog_port_output(const char *log, size_t size);
extern void elog_port_output_lock(void);
extern void elog_port_output_unlock(void);
/**
* EasyLogger initialize.
*
* @return result
*/
ElogErrCode elog_init(void) {
extern ElogErrCode elog_port_init(void);
extern ElogErrCode elog_async_init(void);
ElogErrCode result = ELOG_NO_ERR;
if (elog.init_ok == true) {
return result;
}
/* port initialize */
result = elog_port_init();
if (result != ELOG_NO_ERR) {
return result;
}
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
result = elog_async_init();
if (result != ELOG_NO_ERR) {
return result;
}
#endif
/* enable the output lock */
elog_output_lock_enabled(true);
/* output locked status initialize */
elog.output_is_locked_before_enable = false;
elog.output_is_locked_before_disable = false;
#ifdef ELOG_COLOR_ENABLE
/* enable text color by default */
elog_set_text_color_enabled(true);
#endif
/* set level is ELOG_LVL_VERBOSE */
elog_set_filter_lvl(ELOG_LVL_VERBOSE);
/* set tag_level to default val */
elog_set_filter_tag_lvl_default();
elog.init_ok = true;
return result;
}
/**
* EasyLogger deinitialize.
*
*/
void elog_deinit(void) {
extern ElogErrCode elog_port_deinit(void);
extern ElogErrCode elog_async_deinit(void);
if (!elog.init_ok) {
return ;
}
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
elog_async_deinit();
#endif
/* port deinitialize */
elog_port_deinit();
elog.init_ok = false;
}
/**
* EasyLogger start after initialize.
*/
void elog_start(void) {
if (!elog.init_ok) {
return ;
}
/* enable output */
elog_set_output_enabled(true);
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
elog_async_enabled(true);
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
elog_buf_enabled(true);
#endif
}
/**
* EasyLogger stop after initialize.
*/
void elog_stop(void) {
if (!elog.init_ok) {
return ;
}
/* disable output */
elog_set_output_enabled(false);
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
elog_async_enabled(false);
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
elog_buf_enabled(false);
#endif
/* show version */
log_i("EasyLogger V%s is deinitialize success.", ELOG_SW_VERSION);
}
/**
* set output enable or disable
*
* @param enabled TRUE: enable FALSE: disable
*/
void elog_set_output_enabled(bool enabled) {
ELOG_ASSERT((enabled == false) || (enabled == true));
elog.output_enabled = enabled;
}
#ifdef ELOG_COLOR_ENABLE
/**
* set log text color enable or disable
*
* @param enabled TRUE: enable FALSE:disable
*/
void elog_set_text_color_enabled(bool enabled) {
ELOG_ASSERT((enabled == false) || (enabled == true));
elog.text_color_enabled = enabled;
}
/**
* get log text color enable status
*
* @return enable or disable
*/
bool elog_get_text_color_enabled(void) {
return elog.text_color_enabled;
}
#endif /* ELOG_COLOR_ENABLE */
/**
* get output is enable or disable
*
* @return enable or disable
*/
bool elog_get_output_enabled(void) {
return elog.output_enabled;
}
/**
* set log output format. only enable or disable
*
* @param level level
* @param set format set
*/
void elog_set_fmt(uint8_t level, size_t set) {
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
elog.enabled_fmt_set[level] = set;
}
/**
* set log filter all parameter
*
* @param level level
* @param tag tag
* @param keyword keyword
*/
void elog_set_filter(uint8_t level, const char *tag, const char *keyword) {
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
elog_set_filter_lvl(level);
elog_set_filter_tag(tag);
elog_set_filter_kw(keyword);
}
/**
* set log filter's level
*
* @param level level
*/
void elog_set_filter_lvl(uint8_t level) {
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
elog.filter.level = level;
}
/**
* set log filter's tag
*
* @param tag tag
*/
void elog_set_filter_tag(const char *tag) {
strncpy(elog.filter.tag, tag, ELOG_FILTER_TAG_MAX_LEN);
}
/**
* set log filter's keyword
*
* @param keyword keyword
*/
void elog_set_filter_kw(const char *keyword) {
strncpy(elog.filter.keyword, keyword, ELOG_FILTER_KW_MAX_LEN);
}
/**
* lock output
*/
void elog_output_lock(void) {
if (elog.output_lock_enabled) {
elog_port_output_lock();
elog.output_is_locked_before_disable = true;
} else {
elog.output_is_locked_before_enable = true;
}
}
/**
* unlock output
*/
void elog_output_unlock(void) {
if (elog.output_lock_enabled) {
elog_port_output_unlock();
elog.output_is_locked_before_disable = false;
} else {
elog.output_is_locked_before_enable = false;
}
}
/**
* set log filter's tag level val to default
*/
static void elog_set_filter_tag_lvl_default(void)
{
uint8_t i = 0;
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
memset(elog.filter.tag_lvl[i].tag, '\0', ELOG_FILTER_TAG_MAX_LEN + 1);
elog.filter.tag_lvl[i].level = ELOG_FILTER_LVL_SILENT;
elog.filter.tag_lvl[i].tag_use_flag = false;
}
}
/**
* Set the filter's level by different tag.
* The log on this tag which level is less than it will stop output.
*
* example:
* // the example tag log enter silent mode
* elog_set_filter_tag_lvl("example", ELOG_FILTER_LVL_SILENT);
* // the example tag log which level is less than INFO level will stop output
* elog_set_filter_tag_lvl("example", ELOG_LVL_INFO);
* // remove example tag's level filter, all level log will resume output
* elog_set_filter_tag_lvl("example", ELOG_FILTER_LVL_ALL);
*
* @param tag log tag
* @param level The filter level. When the level is ELOG_FILTER_LVL_SILENT, the log enter silent mode.
* When the level is ELOG_FILTER_LVL_ALL, it will remove this tag's level filer.
* Then all level log will resume output.
*
*/
void elog_set_filter_tag_lvl(const char *tag, uint8_t level)
{
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
ELOG_ASSERT(tag != ((void *)0));
uint8_t i = 0;
if (!elog.init_ok) {
return;
}
elog_output_lock();
/* find the tag in arr */
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
if (elog.filter.tag_lvl[i].tag_use_flag == true &&
!strncmp(tag, elog.filter.tag_lvl[i].tag,ELOG_FILTER_TAG_MAX_LEN)){
break;
}
}
if (i < ELOG_FILTER_TAG_LVL_MAX_NUM){
/* find OK */
if (level == ELOG_FILTER_LVL_ALL){
/* remove current tag's level filter when input level is the lowest level */
elog.filter.tag_lvl[i].tag_use_flag = false;
memset(elog.filter.tag_lvl[i].tag, '\0', ELOG_FILTER_TAG_MAX_LEN + 1);
elog.filter.tag_lvl[i].level = ELOG_FILTER_LVL_SILENT;
} else{
elog.filter.tag_lvl[i].level = level;
}
} else{
/* only add the new tag's level filer when level is not ELOG_FILTER_LVL_ALL */
if (level != ELOG_FILTER_LVL_ALL){
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
if (elog.filter.tag_lvl[i].tag_use_flag == false){
strncpy(elog.filter.tag_lvl[i].tag, tag, ELOG_FILTER_TAG_MAX_LEN);
elog.filter.tag_lvl[i].level = level;
elog.filter.tag_lvl[i].tag_use_flag = true;
break;
}
}
}
}
elog_output_unlock();
}
/**
* get the level on tag's level filer
*
* @param tag tag
*
* @return It will return the lowest level when tag was not found.
* Other level will return when tag was found.
*/
uint8_t elog_get_filter_tag_lvl(const char *tag)
{
ELOG_ASSERT(tag != ((void *)0));
uint8_t i = 0;
uint8_t level = ELOG_FILTER_LVL_ALL;
if (!elog.init_ok) {
return level;
}
elog_output_lock();
/* find the tag in arr */
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
if (elog.filter.tag_lvl[i].tag_use_flag == true &&
!strncmp(tag, elog.filter.tag_lvl[i].tag,ELOG_FILTER_TAG_MAX_LEN)){
level = elog.filter.tag_lvl[i].level;
break;
}
}
elog_output_unlock();
return level;
}
/**
* output RAW format log
*
* @param format output format
* @param ... args
*/
void elog_raw_output(const char *format, ...) {
va_list args;
size_t log_len = 0;
int fmt_result;
/* check output enabled */
if (!elog.output_enabled) {
return;
}
/* args point to the first variable parameter */
va_start(args, format);
/* lock output */
elog_output_lock();
/* package log data to buffer */
fmt_result = vsnprintf(log_buf, ELOG_LINE_BUF_SIZE, format, args);
/* output converted log */
if ((fmt_result > -1) && (fmt_result <= ELOG_LINE_BUF_SIZE)) {
log_len = fmt_result;
} else {
log_len = ELOG_LINE_BUF_SIZE;
}
/* output log */
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
extern void elog_async_output(uint8_t level, const char *log, size_t size);
/* raw log will using assert level */
elog_async_output(ELOG_LVL_ASSERT, log_buf, log_len);
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
extern void elog_buf_output(const char *log, size_t size);
elog_buf_output(log_buf, log_len);
#else
elog_port_output(log_buf, log_len);
#endif
/* unlock output */
elog_output_unlock();
va_end(args);
}
/**
* output the log
*
* @param level level
* @param tag tag
* @param file file name
* @param func function name
* @param line line number
* @param format output format
* @param ... args
*
*/
void elog_output(uint8_t level, const char *tag, const char *file, const char *func,
const long line, const char *format, ...) {
extern const char *elog_port_get_time(void);
extern const char *elog_port_get_p_info(void);
extern const char *elog_port_get_t_info(void);
size_t tag_len = strlen(tag), log_len = 0, newline_len = strlen(ELOG_NEWLINE_SIGN);
char line_num[ELOG_LINE_NUM_MAX_LEN + 1] = { 0 };
char tag_sapce[ELOG_FILTER_TAG_MAX_LEN / 2 + 1] = { 0 };
va_list args;
int fmt_result;
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
/* check output enabled */
if (!elog.output_enabled) {
return;
}
/* level filter */
if (level > elog.filter.level || level > elog_get_filter_tag_lvl(tag)) {
return;
} else if (!strstr(tag, elog.filter.tag)) { /* tag filter */
return;
}
/* args point to the first variable parameter */
va_start(args, format);
/* lock output */
elog_output_lock();
#ifdef ELOG_COLOR_ENABLE
/* add CSI start sign and color info */
if (elog.text_color_enabled) {
log_len += elog_strcpy(log_len, log_buf + log_len, CSI_START);
log_len += elog_strcpy(log_len, log_buf + log_len, color_output_info[level]);
}
#endif
/* package level info */
if (get_fmt_enabled(level, ELOG_FMT_LVL)) {
log_len += elog_strcpy(log_len, log_buf + log_len, level_output_info[level]);
}
/* package tag info */
if (get_fmt_enabled(level, ELOG_FMT_TAG)) {
log_len += elog_strcpy(log_len, log_buf + log_len, tag);
/* if the tag length is less than 50% ELOG_FILTER_TAG_MAX_LEN, then fill space */
if (tag_len <= ELOG_FILTER_TAG_MAX_LEN / 2) {
memset(tag_sapce, ' ', ELOG_FILTER_TAG_MAX_LEN / 2 - tag_len);
log_len += elog_strcpy(log_len, log_buf + log_len, tag_sapce);
}
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
}
/* package time, process and thread info */
if (get_fmt_enabled(level, ELOG_FMT_TIME | ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)) {
log_len += elog_strcpy(log_len, log_buf + log_len, "[");
/* package time info */
if (get_fmt_enabled(level, ELOG_FMT_TIME)) {
log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_time());
if (get_fmt_enabled(level, ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)) {
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
}
}
/* package process info */
if (get_fmt_enabled(level, ELOG_FMT_P_INFO)) {
log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_p_info());
if (get_fmt_enabled(level, ELOG_FMT_T_INFO)) {
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
}
}
/* package thread info */
if (get_fmt_enabled(level, ELOG_FMT_T_INFO)) {
log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_t_info());
}
log_len += elog_strcpy(log_len, log_buf + log_len, "] ");
}
/* package file directory and name, function name and line number info */
if (get_fmt_used_and_enabled_ptr(level, ELOG_FMT_DIR, file) ||
get_fmt_used_and_enabled_ptr(level, ELOG_FMT_FUNC, func) ||
get_fmt_used_and_enabled_u32(level, ELOG_FMT_LINE, line)) {
log_len += elog_strcpy(log_len, log_buf + log_len, "(");
/* package file info */
if (get_fmt_used_and_enabled_ptr(level, ELOG_FMT_DIR, file)) {
log_len += elog_strcpy(log_len, log_buf + log_len, file);
if (get_fmt_used_and_enabled_ptr(level, ELOG_FMT_FUNC, func)) {
log_len += elog_strcpy(log_len, log_buf + log_len, ":");
} else if (get_fmt_used_and_enabled_u32(level, ELOG_FMT_LINE, line)) {
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
}
}
/* package line info */
if (get_fmt_used_and_enabled_u32(level, ELOG_FMT_LINE, line)) {
snprintf(line_num, ELOG_LINE_NUM_MAX_LEN, "%ld", line);
log_len += elog_strcpy(log_len, log_buf + log_len, line_num);
if (get_fmt_used_and_enabled_ptr(level, ELOG_FMT_FUNC, func)) {
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
}
}
/* package func info */
if (get_fmt_used_and_enabled_ptr(level, ELOG_FMT_FUNC, func)) {
log_len += elog_strcpy(log_len, log_buf + log_len, func);
}
log_len += elog_strcpy(log_len, log_buf + log_len, ")");
}
/* package other log data to buffer. '\0' must be added in the end by vsnprintf. */
fmt_result = vsnprintf(log_buf + log_len, ELOG_LINE_BUF_SIZE - log_len, format, args);
va_end(args);
/* calculate log length */
if ((log_len + fmt_result <= ELOG_LINE_BUF_SIZE) && (fmt_result > -1)) {
log_len += fmt_result;
} else {
/* using max length */
log_len = ELOG_LINE_BUF_SIZE;
}
/* overflow check and reserve some space for CSI end sign and newline sign */
#ifdef ELOG_COLOR_ENABLE
if (log_len + (sizeof(CSI_END) - 1) + newline_len > ELOG_LINE_BUF_SIZE) {
/* using max length */
log_len = ELOG_LINE_BUF_SIZE;
/* reserve some space for CSI end sign */
log_len -= (sizeof(CSI_END) - 1);
#else
if (log_len + newline_len > ELOG_LINE_BUF_SIZE) {
/* using max length */
log_len = ELOG_LINE_BUF_SIZE;
#endif /* ELOG_COLOR_ENABLE */
/* reserve some space for newline sign */
log_len -= newline_len;
}
/* keyword filter */
if (elog.filter.keyword[0] != '\0') {
/* add string end sign */
log_buf[log_len] = '\0';
/* find the keyword */
if (!strstr(log_buf, elog.filter.keyword)) {
/* unlock output */
elog_output_unlock();
return;
}
}
#ifdef ELOG_COLOR_ENABLE
/* add CSI end sign */
if (elog.text_color_enabled) {
log_len += elog_strcpy(log_len, log_buf + log_len, CSI_END);
}
#endif
/* package newline sign */
log_len += elog_strcpy(log_len, log_buf + log_len, ELOG_NEWLINE_SIGN);
/* output log */
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
extern void elog_async_output(uint8_t level, const char *log, size_t size);
elog_async_output(level, log_buf, log_len);
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
extern void elog_buf_output(const char *log, size_t size);
elog_buf_output(log_buf, log_len);
#else
elog_port_output(log_buf, log_len);
#endif
/* unlock output */
elog_output_unlock();
}
/**
* get format enabled
*
* @param level level
* @param set format set
*
* @return enable or disable
*/
static bool get_fmt_enabled(uint8_t level, size_t set) {
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
if (elog.enabled_fmt_set[level] & set) {
return true;
} else {
return false;
}
}
static bool get_fmt_used_and_enabled_u32(uint8_t level, size_t set, uint32_t arg) {
return arg && get_fmt_enabled(level, set);
}
static bool get_fmt_used_and_enabled_ptr(uint8_t level, size_t set, const char* arg) {
return arg && get_fmt_enabled(level, set);
}
/**
* enable or disable logger output lock
* @note disable this lock is not recommended except you want output system exception log
*
* @param enabled true: enable false: disable
*/
void elog_output_lock_enabled(bool enabled) {
elog.output_lock_enabled = enabled;
/* it will re-lock or re-unlock before output lock enable */
if (elog.output_lock_enabled) {
if (!elog.output_is_locked_before_disable && elog.output_is_locked_before_enable) {
/* the output lock is unlocked before disable, and the lock will unlocking after enable */
elog_port_output_lock();
} else if (elog.output_is_locked_before_disable && !elog.output_is_locked_before_enable) {
/* the output lock is locked before disable, and the lock will locking after enable */
elog_port_output_unlock();
}
}
}
/**
* Set a hook function to EasyLogger assert. It will run when the expression is false.
*
* @param hook the hook function
*/
void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line)) {
elog_assert_hook = hook;
}
/**
* find the log level
* @note make sure the log level is output on each format
*
* @param log log buffer
*
* @return log level, found failed will return -1
*/
int8_t elog_find_lvl(const char *log) {
ELOG_ASSERT(log);
/* make sure the log level is output on each format */
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_ASSERT] & ELOG_FMT_LVL);
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_ERROR] & ELOG_FMT_LVL);
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_WARN] & ELOG_FMT_LVL);
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_INFO] & ELOG_FMT_LVL);
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_DEBUG] & ELOG_FMT_LVL);
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_VERBOSE] & ELOG_FMT_LVL);
#ifdef ELOG_COLOR_ENABLE
uint8_t i;
size_t csi_start_len = strlen(CSI_START);
for(i = 0; i < ELOG_LVL_TOTAL_NUM; i ++) {
if (!strncmp(color_output_info[i], log + csi_start_len, strlen(color_output_info[i]))) {
return i;
}
}
/* found failed */
return -1;
#else
switch (log[0]) {
case 'A': return ELOG_LVL_ASSERT;
case 'E': return ELOG_LVL_ERROR;
case 'W': return ELOG_LVL_WARN;
case 'I': return ELOG_LVL_INFO;
case 'D': return ELOG_LVL_DEBUG;
case 'V': return ELOG_LVL_VERBOSE;
default: return -1;
}
#endif
}
/**
* find the log tag
* @note make sure the log tag is output on each format
* @note the tag don't have space in it
*
* @param log log buffer
* @param lvl log level, you can get it by @see elog_find_lvl
* @param tag_len found tag length
*
* @return log tag, found failed will return NULL
*/
const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len) {
const char *tag = NULL, *tag_end = NULL;
ELOG_ASSERT(log);
ELOG_ASSERT(tag_len);
ELOG_ASSERT(lvl < ELOG_LVL_TOTAL_NUM);
/* make sure the log tag is output on each format */
ELOG_ASSERT(elog.enabled_fmt_set[lvl] & ELOG_FMT_TAG);
#ifdef ELOG_COLOR_ENABLE
tag = log + strlen(CSI_START) + strlen(color_output_info[lvl]) + strlen(level_output_info[lvl]);
#else
tag = log + strlen(level_output_info[lvl]);
#endif
/* find the first space after tag */
if ((tag_end = memchr(tag, ' ', ELOG_FILTER_TAG_MAX_LEN)) != NULL) {
*tag_len = tag_end - tag;
} else {
tag = NULL;
}
return tag;
}
/**
* dump the hex format data to log
*
* @param name name for hex object, it will show on log header
* @param width hex number for every line, such as: 16, 32
* @param buf hex buffer
* @param size buffer size
*/
void elog_hexdump(const char *name, uint8_t width, const void *buf, uint16_t size)
{
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
uint16_t i, j;
uint16_t log_len = 0;
const uint8_t *buf_p = buf;
char dump_string[8] = {0};
int fmt_result;
if (!elog.output_enabled) {
return;
}
/* level filter */
if (ELOG_LVL_DEBUG > elog.filter.level) {
return;
} else if (!strstr(name, elog.filter.tag)) { /* tag filter */
return;
}
/* lock output */
elog_output_lock();
for (i = 0; i < size; i += width) {
/* package header */
fmt_result = snprintf(log_buf, ELOG_LINE_BUF_SIZE, "D/HEX %s: %04X-%04X: ", name, i, i + width - 1);
/* calculate log length */
if ((fmt_result > -1) && (fmt_result <= ELOG_LINE_BUF_SIZE)) {
log_len = fmt_result;
} else {
log_len = ELOG_LINE_BUF_SIZE;
}
/* dump hex */
for (j = 0; j < width; j++) {
if (i + j < size) {
snprintf(dump_string, sizeof(dump_string), "%02X ", buf_p[i + j]);
} else {
strncpy(dump_string, " ", sizeof(dump_string));
}
log_len += elog_strcpy(log_len, log_buf + log_len, dump_string);
if ((j + 1) % 8 == 0) {
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
}
}
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
/* dump char for hex */
for (j = 0; j < width; j++) {
if (i + j < size) {
snprintf(dump_string, sizeof(dump_string), "%c", __is_print(buf_p[i + j]) ? buf_p[i + j] : '.');
log_len += elog_strcpy(log_len, log_buf + log_len, dump_string);
}
}
/* overflow check and reserve some space for newline sign */
if (log_len + strlen(ELOG_NEWLINE_SIGN) > ELOG_LINE_BUF_SIZE) {
log_len = ELOG_LINE_BUF_SIZE - strlen(ELOG_NEWLINE_SIGN);
}
/* package newline sign */
log_len += elog_strcpy(log_len, log_buf + log_len, ELOG_NEWLINE_SIGN);
/* do log output */
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
extern void elog_async_output(uint8_t level, const char *log, size_t size);
elog_async_output(ELOG_LVL_DEBUG, log_buf, log_len);
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
extern void elog_buf_output(const char *log, size_t size);
elog_buf_output(log_buf, log_len);
#else
elog_port_output(log_buf, log_len);
#endif
}
/* unlock output */
elog_output_unlock();
}

View File

@@ -0,0 +1,79 @@
//
// Created by wangb on 25-6-4.
//
#include "elog.h"
#include <string.h>
/**
* another copy string function
*
* @param cur_len current copied log length, max size is ELOG_LINE_BUF_SIZE
* @param dst destination
* @param src source
*
* @return copied length
*/
size_t elog_strcpy(size_t cur_len, char *dst, const char *src) {
const char *src_old = src;
assert(dst);
assert(src);
while (*src != 0) {
/* make sure destination has enough space */
if (cur_len++ < ELOG_LINE_BUF_SIZE) {
*dst++ = *src++;
} else {
break;
}
}
return src - src_old;
}
/**
* Copy line log split by newline sign. It will copy all log when the newline sign isn't find.
*
* @param line line log buffer
* @param log origin log buffer
* @param len origin log buffer length
*
* @return copy size
*/
size_t elog_cpyln(char *line, const char *log, size_t len) {
size_t newline_len = strlen(ELOG_NEWLINE_SIGN), copy_size = 0;
assert(line);
assert(log);
while (len--) {
*line++ = *log++;
copy_size++;
if (copy_size >= newline_len && !strncmp(log - newline_len, ELOG_NEWLINE_SIGN, newline_len)) {
break;
}
}
return copy_size;
}
/**
* This function will copy memory content from source address to destination
* address.
*
* @param dst the address of destination memory
* @param src the address of source memory
* @param count the copied length
*
* @return the address of destination memory
*/
void *elog_memcpy(void *dst, const void *src, size_t count) {
char *tmp = (char *) dst, *s = (char *) src;
assert(dst);
assert(src);
while (count--)
*tmp++ = *s++;
return dst;
}

View File

@@ -25,6 +25,16 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
#include "adc.h"
#include "tim.h"
#include "motor_driver.h"
#include "elog.h"
#include <stdint.h>
#include <stdio.h>
#include "screen.h"
#include <string.h>
#include <sys/_intsup.h>
/* USER CODE END Includes */
@@ -40,12 +50,29 @@
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE {
HAL_UART_Transmit(&huart5, (uint8_t *) &ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* 按键状态位: bit0..bit3 分别对应 M__KEY, M__KEYC7, HOT_KEY, TIME_KEY, 为1表示按下 */
volatile uint8_t key_state = 0;
volatile uint8_t key_state_prev = 0; /* 上一次的按键状态,用于检测按键变化 */
/* 设备状态标志0表示关闭1表示打开 */
static uint8_t hot_state = 0; /* HOT 设备状态 */
static uint8_t time_state = 0; /* TIME_KEY 时间状态 */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
@@ -54,6 +81,41 @@ const osThreadAttr_t defaultTask_attributes = {
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for KeyTask */
osThreadId_t KeyTaskHandle;
const osThreadAttr_t KeyTask_attributes = {
.name = "KeyTask",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityRealtime,
};
/* Definitions for Sensor_Task */
osThreadId_t Sensor_TaskHandle;
const osThreadAttr_t Sensor_Task_attributes = {
.name = "Sensor_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityHigh7,
};
/* Definitions for Temp_Task */
osThreadId_t Temp_TaskHandle;
const osThreadAttr_t Temp_Task_attributes = {
.name = "Temp_Task",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for Motor_Task */
osThreadId_t Motor_TaskHandle;
const osThreadAttr_t Motor_Task_attributes = {
.name = "Motor_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityNormal1,
};
/* Definitions for Screen_Tsak */
osThreadId_t Screen_TsakHandle;
const osThreadAttr_t Screen_Tsak_attributes = {
.name = "Screen_Tsak",
.stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
@@ -61,6 +123,11 @@ const osThreadAttr_t defaultTask_attributes = {
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void Key(void *argument);
void Sensor(void *argument);
void Temp(void *argument);
void Motor(void *argument);
void Screen(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
@@ -71,7 +138,9 @@ void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
easylogger_init(); /* 初始化 EasyLogger */
__enable_irq(); //开启全局中断
elog_i("task_init", "任务初始!");
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
@@ -94,6 +163,21 @@ void MX_FREERTOS_Init(void) {
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* creation of KeyTask */
KeyTaskHandle = osThreadNew(Key, NULL, &KeyTask_attributes);
/* creation of Sensor_Task */
Sensor_TaskHandle = osThreadNew(Sensor, NULL, &Sensor_Task_attributes);
/* creation of Temp_Task */
Temp_TaskHandle = osThreadNew(Temp, NULL, &Temp_Task_attributes);
/* creation of Motor_Task */
Motor_TaskHandle = osThreadNew(Motor, NULL, &Motor_Task_attributes);
/* creation of Screen_Tsak */
Screen_TsakHandle = osThreadNew(Screen, NULL, &Screen_Tsak_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
@@ -114,14 +198,312 @@ void MX_FREERTOS_Init(void) {
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
// 初始化命令
uint8_t init_cmd1[] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x1E, 0xFE, 0xD7, 0xEF}; // 开启声音
uint8_t init_cmd2[] = {0x7E, 0xFF, 0x06, 0x09, 0x00, 0x00, 0x02, 0xFE, 0xF0, 0xEF}; // 指定播放设备为TF卡
// 定义测试指令数据
uint8_t test_cmd[] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x01, 0xFE, 0xE8, 0xEF};
// 先让模块稳定
osDelay(2000);
// 初始化:先发送开启声音指令,再发送指定播放设备指令
HAL_UART_Transmit(&huart3, init_cmd1, sizeof(init_cmd1), 1000);
osDelay(1500); // 重要:等待模块响应
HAL_UART_Transmit(&huart3, init_cmd2, sizeof(init_cmd2), 1000);
osDelay(1500); // 重要:等待初始化完成
/* Infinite loop */
for(;;)
{
osDelay(1);
// 直接整包发送测试指令
HAL_UART_Transmit(&huart3, test_cmd, sizeof(test_cmd), 1000);
// 把发送的数据打印出来
//elog_d("mp3_cmd","发送测试指令: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", test_cmd[0], test_cmd[1], test_cmd[2], test_cmd[3], test_cmd[4], test_cmd[5], test_cmd[6], test_cmd[7], test_cmd[8], test_cmd[9]);
// 可选:等待发送完成
// while(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET);
HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);
osDelay(1000); // 延时1秒
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_Key */
/**
* @brief Function implementing the KeyTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Key */
void Key(void *argument)
{
/* USER CODE BEGIN Key */
/* 防抖轮询实现四个低电平有效按键检测 */
GPIO_TypeDef* key_ports[4] = {M__KEY_GPIO_Port, M__KEYC7_GPIO_Port, HOT_KEY_GPIO_Port, TIME_KEY_GPIO_Port};
const uint16_t key_pins[4] = {M__KEY_Pin, M__KEYC7_Pin, HOT_KEY_Pin, TIME_KEY_Pin};
uint8_t press_count[4] = {0};
uint8_t release_count[4] = {0};
uint8_t pressed[4] = {0};
const uint8_t THRESH = 3; /* 3 * 10ms = 30ms 防抖 */
for(;;)
{
for (int i = 0; i < 4; i++) {
GPIO_PinState level = HAL_GPIO_ReadPin(key_ports[i], key_pins[i]);
if (level == GPIO_PIN_RESET) { /* 低电平有效 */
press_count[i]++;
release_count[i] = 0;
if (!pressed[i] && press_count[i] >= THRESH) {
pressed[i] = 1;
key_state |= (1 << i); /* bit0..3 分别对应四个按键按下状态 */
}
} else {
release_count[i]++;
press_count[i] = 0;
if (pressed[i] && release_count[i] >= THRESH) {
pressed[i] = 0;
key_state &= ~(1 << i);
}
}
}
osDelay(10); /* 10ms 轮询间隔 */
}
/* USER CODE END Key */
}
/* USER CODE BEGIN Header_Sensor */
/**
* @brief Function implementing the Sensor_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Sensor */
void Sensor(void *argument)
{
/* USER CODE BEGIN Sensor */
/* 按键处理任务 - 按键状态切换控制 */
/* Infinite loop */
for(;;)
{
/* 检测新按下的按键 */
uint8_t key_pressed = key_state & ~key_state_prev;
key_state_prev = key_state;
/* ===== M__KEY (bit0) 控制 ===== */
if (key_pressed & (1 << 0)) {
/* M__KEY 按下:加档(提高转速) */
elog_i("Key", "M__KEY按下 - 加档");
if (Motor_GetGear() == 0) {
Motor_StartupBoost();
} else {
Motor_GearUp();
}
}
/* ===== M__KEYC7 (bit1) 控制 ===== */
if (key_pressed & (1 << 1)) {
/* M__KEYC7 按下:降档(降低转速) */
elog_i("Key", "M__KEYC7按下 - 降档");
Motor_GearDown();
}
/* ===== HOT_KEY (bit2) 控制 ===== */
if (key_pressed & (1 << 2)) {
/* HOT_KEY 按下:切换热功能 */
hot_state = !hot_state;
HAL_GPIO_WritePin(HOT_GPIO_Port, HOT_Pin, hot_state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
/* ===== TIME_KEY (bit3) 控制 ===== */
if (key_pressed & (1 << 3)) {
/* TIME_KEY 按下:切换定时 */
time_state = !time_state;
if (time_state) {
// TODO: 添加定时启动逻辑
} else {
// TODO: 添加定时关闭逻辑
}
}
osDelay(20); /* 20ms 检查一次按键状态 */
}
/* USER CODE END Sensor */
}
/* USER CODE BEGIN Header_Temp */
/**
* @brief Function implementing the Temp_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Temp */
void Temp(void *argument)
{
/* USER CODE BEGIN Temp */
#ifdef ENABLE_TEMP_SENSOR
/* ADC采集参数 */
uint32_t adc_raw = 0; /* ADC原始值 */
uint32_t adc_sum = 0; /* 累加和(用于平均) */
uint16_t sample_count = 32; /* 采样次数 */
float voltage = 0.0f; /* 转换后的电压 */
float temperature = 0.0f; /* 转换后的温度 */
/* 电路参数 */
const float VREF = 3.3f; /* 参考电压 */
/* 一阶低通滤波器 */
float adc_filtered = 0.0f; /* 滤波后的ADC值 */
const float FILTER_ALPHA = 0.1f; /* 滤波系数 */
/* NTC 10K 3950参数 */
const float NTC_B_VALUE = 3950.0f; /* NTC B值 */
const float NTC_R0 = 10000.0f; /* 25°C时电阻10K */
const float NTC_T0 = 298.15f; /* 25°C对应的绝对温度(K) */
const float R_FIXED = 10000.0f; /* 分压电阻10K */
/* ADC校准 */
HAL_ADCEx_Calibration_Start(&hadc1);
/* 预热先采集几次丢弃稳定ADC */
for (uint16_t i = 0; i < 10; i++) {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
osDelay(10);
}
/* Infinite loop */
for(;;)
{
/* 采集多次求平均,提高精度 */
adc_sum = 0;
for (uint16_t i = 0; i < sample_count; i++) {
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {
adc_sum += HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
osDelay(20);
}
/* 计算平均值 */
adc_raw = adc_sum / sample_count;
/* 一阶低通滤波 */
if (adc_filtered == 0.0f) {
adc_filtered = (float)adc_raw;
} else {
adc_filtered = FILTER_ALPHA * (float)adc_raw + (1.0f - FILTER_ALPHA) * adc_filtered;
}
adc_raw = (uint32_t)(adc_filtered + 0.5f);
/* 转换为电压 */
voltage = ((float)adc_raw / 4095.0f) * VREF;
/* ==================== NTC 10K 3950 温度计算 ====================
* 电路3.3V ──[10K固定电阻]──┬── PA0 (ADC)
* │
* [NTC 10K]
* │
* GND
*
* Steinhart-Hart简化方程
* 1/T = 1/T0 + (1/B) * ln(R/R0)
*/
{
/* 计算NTC电阻值 */
float ntc_resistance = R_FIXED * voltage / (VREF - voltage);
/* Steinhart-Hart方程计算温度(K) */
float steinhart = logf(ntc_resistance / NTC_R0) / NTC_B_VALUE + 1.0f / NTC_T0;
temperature = 1.0f / steinhart - 273.15f; /* 转换为摄氏度 */
elog_i("Temp", "ADC:%lu 电压:%.3fV NTC:%.1fΩ 温度:%.1f°C",
adc_raw, voltage, ntc_resistance, temperature);
}
osDelay(1000);
}
#else
/* 温度传感器未启用,任务空转 */
elog_i("Temp", "温度传感器未启用等待NTC改装...");
for(;;)
{
osDelay(5000);
elog_i("Temp", "温度传感器未启用等待NTC改装...");
}
#endif /* ENABLE_TEMP_SENSOR */
/* USER CODE END Temp */
}
/* USER CODE BEGIN Header_Motor */
/**
* @brief Function implementing the Motor_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Motor */
void Motor(void *argument)
{
/* USER CODE BEGIN Motor */
/* 电机驱动初始化 */
Motor_Init();
/* Infinite loop */
for(;;)
{
/* 电机任务主要功能:
* - 监控电机状态(超温保护、过流保护等)
* - 定期打印状态信息
* - 响应紧急停止信号
*/
/* 每1秒打印一次电机状态 */
uint8_t current_gear = Motor_GetGear();
elog_i("Motor", "当前档位: %u (0=停止,1=低,2=中,3=高)", current_gear);
osDelay(1000);
}
/* USER CODE END Motor */
}
/* USER CODE BEGIN Header_Screen */
/**
* @brief Function implementing the Screen_Tsak thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Screen */
void Screen(void *argument)
{
/* USER CODE BEGIN Screen */
char buf[100];
sprintf(buf, "CLR(1);\r\n");
//HAL_UART_Transmit(&huart1, (uint8_t *)buf, strlen(buf), HAL_MAX_DELAY);
/* Infinite loop */
for(;;)
{
HAL_UART_Transmit(&huart1, (uint8_t *)buf, strlen(buf), HAL_MAX_DELAY);
osDelay(2000);
}
/* USER CODE END Screen */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

View File

@@ -50,9 +50,19 @@ void MX_GPIO_Init(void)
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(HOT_GPIO_Port, HOT_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, RUN_LED_Pin|ERR_LED_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : HOT_Pin */
GPIO_InitStruct.Pin = HOT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(HOT_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : RUN_LED_Pin ERR_LED_Pin */
GPIO_InitStruct.Pin = RUN_LED_Pin|ERR_LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
@@ -63,7 +73,7 @@ void MX_GPIO_Init(void)
/*Configure GPIO pins : M__KEY_Pin M__KEYC7_Pin HOT_KEY_Pin TIME_KEY_Pin */
GPIO_InitStruct.Pin = M__KEY_Pin|M__KEYC7_Pin|HOT_KEY_Pin|TIME_KEY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

128
Core/Src/motor_driver.c Normal file
View File

@@ -0,0 +1,128 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file motor_driver.c
* @brief 电机驱动实现 - 双路AT8236-MS H桥驱动
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "motor_driver.h"
#include "elog.h"
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_tim.h"
#include "cmsis_os.h"
#include "tim.h"
/* Private defines -----------------------------------------------------------*/
/* TIM4自动重装载值是99 (100-1)所以PWM值范围是0-99 */
/* Private function prototypes -----------------------------------------------*/
/* PWM parameters */
#define PWM_ARR 99
#define PWM_STEPS (PWM_ARR + 1)
/* 三档占空比(百分比),索引为 0..2 对应 档位 1..3档位0为停止 */
static const uint8_t gears_percent[3] = {75, 80, 85};
/* current_gear: 0 = 停止, 1 = 低, 2 = 中, 3 = 高 */
static uint8_t current_gear = 0; /* 0..3 */
static inline uint32_t percent_to_compare(uint8_t percent) {
return ((uint32_t)percent * PWM_STEPS) / 100U;
}
/* 将两个电机都设置为指定占空比(只使用 TIM4_CH2, TIM4_CH4 输出CH1/CH3 停止以保持单方向) */
static void set_both_motors_percent(uint8_t percent) {
uint32_t cmp = percent_to_compare(percent);
/* 停止并关闭 CH1、使用 CH2 输出 */
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, (uint16_t)cmp);
/* 停止并关闭 CH3、使用 CH4 输出 */
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, (uint16_t)cmp);
}
/* 启动时短暂提升到 90% 并保持 500ms然后降到一档档位1 */
void Motor_StartupBoost(void) {
set_both_motors_percent(90);
osDelay(1500);
current_gear = 1; /* 启动后回到档位1最低速 */
set_both_motors_percent(gears_percent[current_gear - 1]);
}
/* 设置挡位0..30=停止 */
void Motor_SetGear(uint8_t gear) {
if (gear > 3) gear = 3;
current_gear = gear;
if (current_gear == 0) {
set_both_motors_percent(0);
} else {
set_both_motors_percent(gears_percent[current_gear - 1]);
}
}
/* 切换到下一档0->1->2->3->0 循环) */
void Motor_NextGear(void) {
current_gear++;
if (current_gear > 3) current_gear = 0;
if (current_gear == 0) {
set_both_motors_percent(0);
} else {
set_both_motors_percent(gears_percent[current_gear - 1]);
}
}
/* 向上加档(与按键配合使用) */
void Motor_GearUp(void) {
Motor_NextGear();
}
/* 向下减档(循环) */
void Motor_GearDown(void) {
if (current_gear == 0) {
current_gear = 3;
} else {
current_gear--;
}
if (current_gear == 0) {
set_both_motors_percent(0);
} else {
set_both_motors_percent(gears_percent[current_gear - 1]);
}
}
uint8_t Motor_GetGear(void) {
return current_gear;
}
/* Exported functions --------------------------------------------------------*/
/**
* @brief 电机驱动初始化
*/
void Motor_Init(void) {
/* 启动TIM4 PWM输出 */
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
// 初始完全停止电机
Motor_Stop();
}
void Motor_Stop(void) {
// 所有引脚输出0 - 完全停止
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 0);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 0);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 0);
}

40
Core/Src/motor_driver.h Normal file
View File

@@ -0,0 +1,40 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file motor_driver.h
* @brief 电机驱动头文件 - 双路AT8236-MS H桥驱动
******************************************************************************
* @attention
*
* AT8236-MS 双路H桥电机驱动芯片
* - 芯片1: TIM4_CH1 -> AIN1, TIM4_CH2 -> AIN2
* - 芯片2: TIM4_CH3 -> BIN1, TIM4_CH4 -> BIN2
* - 两路电机同步控制:同时启动、同时停止
******************************************************************************
*/
/* USER CODE END Header */
#ifndef __MOTOR_DRIVER_H__
#define __MOTOR_DRIVER_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
void Motor_Init(void);
void Motor_Stop(void) ;
void Motor_StartupBoost(void);
void Motor_SetGear(uint8_t gear);
void Motor_NextGear(void);
void Motor_GearUp(void);
void Motor_GearDown(void);
uint8_t Motor_GetGear(void);
#ifdef __cplusplus
}
#endif
#endif /* __MOTOR_DRIVER_H__ */

189
Core/Src/screen.c Normal file
View File

@@ -0,0 +1,189 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file screen.c
* @brief 串口屏驱动实现JC系列使用 USART1
******************************************************************************
*/
/* USER CODE END Header */
#include "screen.h"
#include "main.h"
#include "usart.h"
#include "cmsis_os.h"
#include <string.h>
#include <stdio.h>
/* 模块初始化:不要使用 MP3 的二进制初始化指令,改为屏幕清屏作为默认初始化 */
/* 发送缓冲 */
static char txbuf[256];
/**
* @brief 发送字符串到串口屏(阻塞直到发送完成)
* @param cmd: 要发送的C字符串不强制包含结尾CR/LF
* @retval 0=OK, <0=错误
*/
int Screen_SendCmd(const char *cmd) {
if (cmd == NULL) return -1;
size_t len = strlen(cmd);
if (len == 0) return -1;
HAL_StatusTypeDef st = HAL_UART_Transmit(&huart1, (uint8_t *)cmd, (uint16_t)len, HAL_MAX_DELAY);
return (st == HAL_OK) ? 0 : -2;
}
/**
* @brief 发送命令并等待模块返回 "OK\r\n"超时返回非0
*/
int Screen_SendCmdWaitOK(const char *cmd, uint32_t timeout_ms) {
(void)timeout_ms;
/* 保留接口:当前不等待屏幕回包,直接发送后返回发送状态 */
return Screen_SendCmd(cmd);
}
void Screen_Init(void) {
/*
* 屏幕初始化:简单实现为上电等待并清除屏幕
* 若需要按照厂商例程发送更多配置指令,可在此扩展
*/
osDelay(1000);
Screen_Clear(0);
osDelay(200);
}
/* 简单封装接口示例 */
void Screen_Clear(uint8_t layer) {
sprintf(txbuf, "DIR(1);CLR(%u);\r\n", (unsigned)layer);
Screen_SendCmd(txbuf);
}
void Screen_DisplayImage(uint32_t addr) {
sprintf(txbuf, "DIR(1);FSIMG(%lu,0,0,128,128,0);\r\n", (unsigned long)addr);
Screen_SendCmd(txbuf);
}
void Screen_SetBrightness(uint8_t val) {
sprintf(txbuf, "BL(%u);\r\n", (unsigned)val);
Screen_SendCmd(txbuf);
}
void Screen_DrawText16(uint16_t x, uint16_t y, const char *text, uint8_t color) {
sprintf(txbuf, "SBC(%u);DC16(%u,%u,'%s',%u);\r\n", (unsigned)color, (unsigned)x, (unsigned)y, text, (unsigned)color);
Screen_SendCmd(txbuf);
}
/* 额外封装实现 */
/* 以下为屏幕命令封装函数实现,均以字符串形式发送到串口屏 */
/* 函数内部不等待屏幕回包,调用者若需确认执行结果请自行实现回包处理 */
void Screen_SetRotation(uint8_t dir) {
sprintf(txbuf, "DIR(%u);\r\n", dir);
Screen_SendCmd(txbuf);
}
void Screen_SetBaud(uint32_t baud) {
sprintf(txbuf, "BPS(%lu);\r\n", (unsigned long)baud);
Screen_SendCmd(txbuf);
}
void Screen_DisplayImageAtAddr(uint32_t addr, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t mode) {
sprintf(txbuf, "FSIMG(%lu,%u,%u,%u,%u,%u);\r\n", (unsigned long)addr, (unsigned)x, (unsigned)y, (unsigned)w, (unsigned)h, (unsigned)mode);
Screen_SendCmd(txbuf);
}
void Screen_DisplayImageByIndex(uint32_t index, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t mode) {
sprintf(txbuf, "FSIMG(%u,%u,%u,%u,%u,%u);\r\n", (unsigned)index, (unsigned)x, (unsigned)y, (unsigned)w, (unsigned)h, (unsigned)mode);
Screen_SendCmd(txbuf);
}
void Screen_Pixel(uint16_t x, uint16_t y, uint8_t color) {
sprintf(txbuf, "PS(%u,%u,%u);\r\n", (unsigned)x, (unsigned)y, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_Line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color) {
sprintf(txbuf, "PL(%u,%u,%u,%u,%u);\r\n", (unsigned)x1, (unsigned)y1, (unsigned)x2, (unsigned)y2, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_Box(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color) {
sprintf(txbuf, "BOX(%u,%u,%u,%u,%u);\r\n", (unsigned)x1, (unsigned)y1, (unsigned)x2, (unsigned)y2, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_BoxFill(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color) {
sprintf(txbuf, "BOXF(%u,%u,%u,%u,%u);\r\n", (unsigned)x1, (unsigned)y1, (unsigned)x2, (unsigned)y2, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_Circle(uint16_t x, uint16_t y, uint16_t r, uint8_t color) {
sprintf(txbuf, "CIR(%u,%u,%u,%u);\r\n", (unsigned)x, (unsigned)y, (unsigned)r, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_CircleFill(uint16_t x, uint16_t y, uint16_t r, uint8_t color) {
sprintf(txbuf, "CIRF(%u,%u,%u,%u);\r\n", (unsigned)x, (unsigned)y, (unsigned)r, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_SetBGColor(uint8_t color) {
sprintf(txbuf, "SBC(%u);\r\n", (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_DrawText16V(uint16_t x, uint16_t y, const char *text, uint8_t color) {
sprintf(txbuf, "DCV16(%u,%u,'%s',%u);\r\n", (unsigned)x, (unsigned)y, text, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_DrawText24(uint16_t x, uint16_t y, const char *text, uint8_t color) {
sprintf(txbuf, "DC24(%u,%u,'%s',%u);\r\n", (unsigned)x, (unsigned)y, text, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_DrawText24V(uint16_t x, uint16_t y, const char *text, uint8_t color) {
sprintf(txbuf, "DCV24(%u,%u,'%s',%u);\r\n", (unsigned)x, (unsigned)y, text, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_DrawText32(uint16_t x, uint16_t y, const char *text, uint8_t color) {
sprintf(txbuf, "DC32(%u,%u,'%s',%u);\r\n", (unsigned)x, (unsigned)y, text, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_DrawText32V(uint16_t x, uint16_t y, const char *text, uint8_t color) {
sprintf(txbuf, "DCV32(%u,%u,'%s',%u);\r\n", (unsigned)x, (unsigned)y, text, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_DrawText48(uint16_t x, uint16_t y, const char *text, uint8_t color, uint8_t transparent) {
sprintf(txbuf, "DC48(%u,%u,'%s',%u,%u);\r\n", (unsigned)x, (unsigned)y, text, (unsigned)color, (unsigned)transparent);
Screen_SendCmd(txbuf);
}
void Screen_Button(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const char *label, uint8_t fontColor, uint8_t bgColor, uint8_t pressFlag, uint8_t style) {
sprintf(txbuf, "BTN(%u,%u,%u,%u,'%s',%u,%u,%u,%u);\r\n", (unsigned)x, (unsigned)y, (unsigned)w, (unsigned)h, label, (unsigned)fontColor, (unsigned)bgColor, (unsigned)pressFlag, (unsigned)style);
Screen_SendCmd(txbuf);
}
void Screen_QRCode(uint16_t x, uint16_t y, const char *url) {
sprintf(txbuf, "QRCODE(%u,%u,%s);\r\n", (unsigned)x, (unsigned)y, url);
Screen_SendCmd(txbuf);
}
void Screen_QRCodeEx(uint16_t x, uint16_t y, const char *url, uint16_t size, uint8_t color) {
sprintf(txbuf, "QRCODE(%u,%u,%s,%u,%u);\r\n", (unsigned)x, (unsigned)y, url, (unsigned)size, (unsigned)color);
Screen_SendCmd(txbuf);
}
void Screen_Ver(void) {
sprintf(txbuf, "VER();\r\n");
Screen_SendCmd(txbuf);
}
/* USER CODE BEGIN AdditionalFunctions */
/* 可以在这里扩展更多绘图/控件函数供应用层调用 */
/* USER CODE END AdditionalFunctions */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -34,6 +34,7 @@ void MX_TIM4_Init(void)
/* USER CODE END TIM4_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
@@ -41,11 +42,20 @@ void MX_TIM4_Init(void)
/* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler = 0;
htim4.Init.Prescaler = 71;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 65535;
htim4.Init.Period = 99;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
Error_Handler();
@@ -83,10 +93,10 @@ void MX_TIM4_Init(void)
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_pwmHandle->Instance==TIM4)
if(tim_baseHandle->Instance==TIM4)
{
/* USER CODE BEGIN TIM4_MspInit 0 */
@@ -117,7 +127,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN TIM4_MspPostInit 1 */
@@ -127,10 +137,10 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
}
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle)
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_pwmHandle->Instance==TIM4)
if(tim_baseHandle->Instance==TIM4)
{
/* USER CODE BEGIN TIM4_MspDeInit 0 */

27
README.md Normal file
View File

@@ -0,0 +1,27 @@
CLR(1); //使用红色填充整个屏幕,1为红色的色表编号
DIR(1); //屏幕旋转方向: 0 竖向显示 1 旋转90°显示 2 竖向旋转180° 3 横向旋转180°
BPS(115200); //修改波特率为115200,掉电后自动保存设置,但注意波特率在修改过程中不允许掉电,建议只脱机修改一次
BPS(38400); //支持波特率2
BPS(19200); //支持的波特率3
BPS(9600); //支持的波特率4
FSIMG(2097152,0,0,176,220,0); //在MODE_CFG(0)/MODE_CFG(1)下,从(0,0)开始的位置显示第1张图片,图片的宽度是176 高度是220最后的参数0表示正常显示。此为地址模式下显示图片指令
FSIMG(0,0,0,176,220,0); //在MODE_CFG(2)下,从(0,0)开始的位置显示第1张图片,图片的宽度是176 高度是220最后的参数0表示正常显示。此为编号模式下显示图片指令
BL(20); //调整背光的亮度到20 范围0为最亮 255为最暗
PS(20,20,1); //在屏幕的(20,20) 位置用红色描绘一个点,1为红色的色表编号
PL(0,0,90,90,1); //将屏幕的(0,0) 位置的点和(90,90)位置的点用红色的直线连起来 ,1为红色的色表编号
BOX(20,20,40,40,1); //对角线(20,20)和(40,40)画线框 ,1为红色的色表编号
BOXF(20,20,40,40,1); //对角线(20,20)和(40,40)画填充框 ,1为红色的色表编号
CIR(60,60,3,1); //(60,60)为圆心 3为半径用红色画一个线圆 ,1为红色的色表编号
CIRF(60,60,3,1); //(60,60)为圆心 3为半径用红色画一个填充圆, ,1为红色的色表编号
SBC(1); //设置背景色为红色,此命令配合DCV和DC48指令一起使用 ,1为红色的色表编号
DC16(30,30,'串口模块',1); // 用红色以(30,30)为起点,在屏幕上显示透明的'串口模块'这四个字,字体大小为16,1为红色的色表编号
DCV16(30,30,'串口模块',1); //用红色以(30,30)为起点,在屏幕显示带背景色的'串口模块'这四个字,字体大小为16,1为红色的色表编号
DC24(30,30,'串口模块',1); // 用红色以(30,30)为起点,在屏幕上显示透明的'串口模块'这四个字字体大小为24,1为红色的色表编号
DCV24(30,30,'串口模块',1); //用红色以(30,30)为起点,在屏幕显示带背景色的'串口模块'这四个字字体大小为24,1为红色的色表编号
DC32(30,30,'串口模块',1); //用红色以(30,30)为起点,在屏幕上显示透明的'串口模块'这四个字字体大小为32,1为红色的色表编号
DCV32(30,30,'串口模块',1); //用红色以(30,30)为起点,在屏幕显示带背景色的'串口模块'这四个字字体大小为32,1为红色的色表编号
DC48(30,46,'串口模块',1,0); //用红色以(30,46)为起点,在屏幕上显示透明的'串口模块'四个字字体大小为48,1为红色的色表编号 参数0表示透明显示
BTN(80,80,32,16,'按钮',1,0,1,4); //在(80,80)的位置显示一个下压的按钮,按钮字体为红色,背景为黄色
QRCODE(10,10,www.sun-lcm.com); //在(10,10)的位置显示一个二维码,扫码后指向一个网页链接 注意目前只有MF022支持此指令
QRCODE(10,10,www.sun-lcm.com,100,1); //在(10,10)的位置 显示限定大小为100模块内部根据版本大小会自适应颜色值为1红色的一个二维码扫码后指向一个网页链接 注意目前只有MF219支持此指令
VER(); //获取模块的固件版本信息

View File

@@ -1,17 +1,20 @@
#MicroXplorer Configuration settings - do not modify
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_0
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag
ADC1.ContinuousConvMode=ENABLE
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,ContinuousConvMode
ADC1.NbrOfConversionFlag=1
ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_239CYCLES_5
ADC1.master=1
CAD.formats=
CAD.pinconfig=
CAD.provider=
FREERTOS.IPParameters=Tasks01
FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
FREERTOS.FootprintOK=false
FREERTOS.IPParameters=Tasks01,FootprintOK,configTOTAL_HEAP_SIZE
FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;KeyTask,48,512,Key,Default,NULL,Dynamic,NULL,NULL;Sensor_Task,47,512,Sensor,Default,NULL,Dynamic,NULL,NULL;Temp_Task,24,256,Temp,Default,NULL,Dynamic,NULL,NULL;Motor_Task,25,512,Motor,Default,NULL,Dynamic,NULL,NULL;Screen_Tsak,24,1024,Screen,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configTOTAL_HEAP_SIZE=15000
File.Version=6
GPIO.groupedBy=
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
Mcu.CPN=STM32F103RCT6
Mcu.Family=STM32F1
@@ -29,28 +32,30 @@ Mcu.Name=STM32F103R(C-D-E)Tx
Mcu.Package=LQFP64
Mcu.Pin0=PD0-OSC_IN
Mcu.Pin1=PD1-OSC_OUT
Mcu.Pin10=PC9
Mcu.Pin11=PA9
Mcu.Pin12=PA10
Mcu.Pin13=PA13
Mcu.Pin14=PA14
Mcu.Pin15=PC12
Mcu.Pin16=PD2
Mcu.Pin17=PB6
Mcu.Pin18=PB7
Mcu.Pin19=PB8
Mcu.Pin10=PC8
Mcu.Pin11=PC9
Mcu.Pin12=PA9
Mcu.Pin13=PA10
Mcu.Pin14=PA13
Mcu.Pin15=PA14
Mcu.Pin16=PC12
Mcu.Pin17=PD2
Mcu.Pin18=PB6
Mcu.Pin19=PB7
Mcu.Pin2=PA0-WKUP
Mcu.Pin20=PB9
Mcu.Pin21=VP_FREERTOS_VS_CMSIS_V2
Mcu.Pin22=VP_SYS_VS_tim8
Mcu.Pin3=PB10
Mcu.Pin4=PB11
Mcu.Pin5=PB12
Mcu.Pin6=PB13
Mcu.Pin7=PC6
Mcu.Pin8=PC7
Mcu.Pin9=PC8
Mcu.PinsNb=23
Mcu.Pin20=PB8
Mcu.Pin21=PB9
Mcu.Pin22=VP_FREERTOS_VS_CMSIS_V2
Mcu.Pin23=VP_SYS_VS_tim8
Mcu.Pin24=VP_TIM4_VS_ClockSourceINT
Mcu.Pin3=PA1
Mcu.Pin4=PB10
Mcu.Pin5=PB11
Mcu.Pin6=PB12
Mcu.Pin7=PB13
Mcu.Pin8=PC6
Mcu.Pin9=PC7
Mcu.PinsNb=25
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103RCTx
@@ -74,6 +79,12 @@ NVIC.TimeBase=TIM8_UP_IRQn
NVIC.TimeBaseIP=TIM8
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
PA0-WKUP.Signal=ADCx_IN0
PA1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PA1.GPIO_Label=HOT
PA1.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PA1.GPIO_PuPd=GPIO_PULLDOWN
PA1.Locked=true
PA1.Signal=GPIO_Output
PA10.Locked=true
PA10.Mode=Asynchronous
PA10.Signal=USART1_RX
@@ -96,26 +107,38 @@ PB13.GPIOParameters=GPIO_Label
PB13.GPIO_Label=ERR_LED
PB13.Locked=true
PB13.Signal=GPIO_Output
PB6.GPIOParameters=GPIO_Speed
PB6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PB6.Signal=S_TIM4_CH1
PB7.GPIOParameters=GPIO_Speed
PB7.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PB7.Signal=S_TIM4_CH2
PB8.GPIOParameters=GPIO_Speed
PB8.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PB8.Signal=S_TIM4_CH3
PB9.GPIOParameters=GPIO_Speed
PB9.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PB9.Signal=S_TIM4_CH4
PC12.Mode=Asynchronous
PC12.Signal=UART5_TX
PC6.GPIOParameters=GPIO_Label
PC6.GPIOParameters=GPIO_PuPd,GPIO_Label
PC6.GPIO_Label=M+_KEY
PC6.GPIO_PuPd=GPIO_PULLUP
PC6.Locked=true
PC6.Signal=GPIO_Input
PC7.GPIOParameters=GPIO_Label
PC7.GPIOParameters=GPIO_PuPd,GPIO_Label
PC7.GPIO_Label=M-_KEY
PC7.GPIO_PuPd=GPIO_PULLUP
PC7.Locked=true
PC7.Signal=GPIO_Input
PC8.GPIOParameters=GPIO_Label
PC8.GPIOParameters=GPIO_PuPd,GPIO_Label
PC8.GPIO_Label=HOT_KEY
PC8.GPIO_PuPd=GPIO_PULLUP
PC8.Locked=true
PC8.Signal=GPIO_Input
PC9.GPIOParameters=GPIO_Label
PC9.GPIOParameters=GPIO_PuPd,GPIO_Label
PC9.GPIO_Label=TIME_KEY
PC9.GPIO_PuPd=GPIO_PULLUP
PC9.Locked=true
PC9.Signal=GPIO_Input
PCC.Checker=false
@@ -201,11 +224,14 @@ SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3
SH.S_TIM4_CH3.ConfNb=1
SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4
SH.S_TIM4_CH4.ConfNb=1
TIM4.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM4.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4
TIM4.IPParameters=Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Prescaler,Period,AutoReloadPreload,Channel-PWM Generation1 CH1,Channel-PWM Generation3 CH3
TIM4.Period=99
TIM4.Prescaler=71
UART5.IPParameters=VirtualMode
UART5.VirtualMode=Asynchronous
USART1.IPParameters=VirtualMode
@@ -216,4 +242,7 @@ VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2
VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2
VP_SYS_VS_tim8.Mode=TIM8
VP_SYS_VS_tim8.Signal=SYS_VS_tim8
VP_TIM4_VS_ClockSourceINT.Mode=Internal
VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT
board=custom
rtos.0.ip=FREERTOS

View File

@@ -0,0 +1,35 @@
/* ----------------------------------------------------------------------
* Copyright (C) 2010 ARM Limited. All rights reserved.
*
* $Date: 11. November 2010
* $Revision: V1.0.2
*
* Project: CMSIS DSP Library
* Title: arm_common_tables.h
*
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
*
* Target Processor: Cortex-M4/Cortex-M3
*
* Version 1.0.2 2010/11/11
* Documentation updated.
*
* Version 1.0.1 2010/10/05
* Production release and review comments incorporated.
*
* Version 1.0.0 2010/09/20
* Production release and review comments incorporated.
* -------------------------------------------------------------------- */
#ifndef _ARM_COMMON_TABLES_H
#define _ARM_COMMON_TABLES_H
#include "arm_math.h"
extern uint16_t armBitRevTable[256];
extern q15_t armRecipTableQ15[64];
extern q31_t armRecipTableQ31[64];
extern const q31_t realCoefAQ31[1024];
extern const q31_t realCoefBQ31[1024];
#endif /* ARM_COMMON_TABLES_H */

View File

@@ -0,0 +1,665 @@
/**************************************************************************//**
* @file core_cm0.h
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
* @version V2.10
* @date 19. July 2011
*
* @note
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
******************************************************************************/
#if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __CORE_CM0_H_GENERIC
#define __CORE_CM0_H_GENERIC
/** \mainpage CMSIS Cortex-M0
This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer.
It consists of:
- Cortex-M Core Register Definitions
- Cortex-M functions
- Cortex-M instructions
The CMSIS Cortex-M0 Core Peripheral Access Layer contains C and assembly functions that ease
access to the Cortex-M Core
*/
/** \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions
CMSIS violates following MISRA-C2004 Rules:
- Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.<br>
Function definitions in header files are used to allow 'inlining'.
- Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
Unions are used for effective representation of core registers.
- Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.<br>
Function-like macros are used to allow more efficient code.
*/
/*******************************************************************************
* CMSIS definitions
******************************************************************************/
/** \defgroup CMSIS_core_definitions CMSIS Core Definitions
This file defines all structures and symbols for CMSIS core:
- CMSIS version number
- Cortex-M core
- Cortex-M core Revision Number
@{
*/
/* CMSIS CM0 definitions */
#define __CM0_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */
#define __CM0_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */
#define __CORTEX_M (0x00) /*!< Cortex core */
#if defined ( __CC_ARM )
#define __ASM __asm /*!< asm keyword for ARM Compiler */
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
#elif defined ( __ICCARM__ )
#define __ASM __asm /*!< asm keyword for IAR Compiler */
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
#elif defined ( __GNUC__ )
#define __ASM __asm /*!< asm keyword for GNU Compiler */
#define __INLINE inline /*!< inline keyword for GNU Compiler */
#elif defined ( __TASKING__ )
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
#endif
/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */
#define __FPU_USED 0
#if defined ( __CC_ARM )
#if defined __TARGET_FPU_VFP
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __ICCARM__ )
#if defined __ARMVFP__
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __GNUC__ )
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __TASKING__ )
/* add preprocessor checks */
#endif
#include <stdint.h> /*!< standard types definitions */
#include "core_cmInstr.h" /*!< Core Instruction Access */
#include "core_cmFunc.h" /*!< Core Function Access */
#endif /* __CORE_CM0_H_GENERIC */
#ifndef __CMSIS_GENERIC
#ifndef __CORE_CM0_H_DEPENDANT
#define __CORE_CM0_H_DEPENDANT
/* check device defines and use defaults */
#if defined __CHECK_DEVICE_DEFINES
#ifndef __CM0_REV
#define __CM0_REV 0x0000
#warning "__CM0_REV not defined in device header file; using default!"
#endif
#ifndef __NVIC_PRIO_BITS
#define __NVIC_PRIO_BITS 2
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
#endif
#ifndef __Vendor_SysTickConfig
#define __Vendor_SysTickConfig 0
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
#endif
#endif
/* IO definitions (access restrictions to peripheral registers) */
#ifdef __cplusplus
#define __I volatile /*!< defines 'read only' permissions */
#else
#define __I volatile const /*!< defines 'read only' permissions */
#endif
#define __O volatile /*!< defines 'write only' permissions */
#define __IO volatile /*!< defines 'read / write' permissions */
/*@} end of group CMSIS_core_definitions */
/*******************************************************************************
* Register Abstraction
******************************************************************************/
/** \defgroup CMSIS_core_register CMSIS Core Register
Core Register contain:
- Core Register
- Core NVIC Register
- Core SCB Register
- Core SysTick Register
*/
/** \ingroup CMSIS_core_register
\defgroup CMSIS_CORE CMSIS Core
Type definitions for the Cortex-M Core Registers
@{
*/
/** \brief Union type to access the Application Program Status Register (APSR).
*/
typedef union
{
struct
{
#if (__CORTEX_M != 0x04)
uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */
#else
uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */
uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */
uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */
#endif
uint32_t Q:1; /*!< bit: 27 Saturation condition flag */
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} APSR_Type;
/** \brief Union type to access the Interrupt Program Status Register (IPSR).
*/
typedef union
{
struct
{
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} IPSR_Type;
/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR).
*/
typedef union
{
struct
{
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
#if (__CORTEX_M != 0x04)
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
#else
uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */
uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */
uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */
#endif
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */
uint32_t Q:1; /*!< bit: 27 Saturation condition flag */
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} xPSR_Type;
/** \brief Union type to access the Control Registers (CONTROL).
*/
typedef union
{
struct
{
uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */
uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} CONTROL_Type;
/*@} end of group CMSIS_CORE */
/** \ingroup CMSIS_core_register
\defgroup CMSIS_NVIC CMSIS NVIC
Type definitions for the Cortex-M NVIC Registers
@{
*/
/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
*/
typedef struct
{
__IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
uint32_t RESERVED0[31];
__IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
uint32_t RSERVED1[31];
__IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
uint32_t RESERVED2[31];
__IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
uint32_t RESERVED3[31];
uint32_t RESERVED4[64];
__IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
} NVIC_Type;
/*@} end of group CMSIS_NVIC */
/** \ingroup CMSIS_core_register
\defgroup CMSIS_SCB CMSIS SCB
Type definitions for the Cortex-M System Control Block Registers
@{
*/
/** \brief Structure type to access the System Control Block (SCB).
*/
typedef struct
{
__I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
__IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
uint32_t RESERVED0;
__IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
__IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
__IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
uint32_t RESERVED1;
__IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
__IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
} SCB_Type;
/* SCB CPUID Register Definitions */
#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */
#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */
/* SCB Interrupt Control State Register Definitions */
#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */
/* SCB Application Interrupt and Reset Control Register Definitions */
#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
/* SCB System Control Register Definitions */
#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
/* SCB Configuration Control Register Definitions */
#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
/* SCB System Handler Control and State Register Definitions */
#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
/*@} end of group CMSIS_SCB */
/** \ingroup CMSIS_core_register
\defgroup CMSIS_SysTick CMSIS SysTick
Type definitions for the Cortex-M System Timer Registers
@{
*/
/** \brief Structure type to access the System Timer (SysTick).
*/
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
} SysTick_Type;
/* SysTick Control / Status Register Definitions */
#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */
/* SysTick Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */
/* SysTick Current Register Definitions */
#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */
/* SysTick Calibration Register Definitions */
#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */
/*@} end of group CMSIS_SysTick */
/** \ingroup CMSIS_core_register
\defgroup CMSIS_CoreDebug CMSIS Core Debug
Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP
and not via processor. Therefore they are not covered by the Cortex-M0 header file.
@{
*/
/*@} end of group CMSIS_CoreDebug */
/** \ingroup CMSIS_core_register
@{
*/
/* Memory mapping of Cortex-M0 Hardware */
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
/*@} */
/*******************************************************************************
* Hardware Abstraction Layer
******************************************************************************/
/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface
Core Function Interface contains:
- Core NVIC Functions
- Core SysTick Functions
- Core Register Access Functions
*/
/* ########################## NVIC functions #################################### */
/** \ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions
@{
*/
/* Interrupt Priorities are WORD accessible only under ARMv6M */
/* The following MACROS handle generation of the register offset and byte masks */
#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 )
#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) )
#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) )
/** \brief Enable External Interrupt
This function enables a device specific interrupt in the NVIC interrupt controller.
The interrupt number cannot be a negative value.
\param [in] IRQn Number of the external interrupt to enable
*/
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/** \brief Disable External Interrupt
This function disables a device specific interrupt in the NVIC interrupt controller.
The interrupt number cannot be a negative value.
\param [in] IRQn Number of the external interrupt to disable
*/
static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
{
NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/** \brief Get Pending Interrupt
This function reads the pending register in the NVIC and returns the pending bit
for the specified interrupt.
\param [in] IRQn Number of the interrupt for get pending
\return 0 Interrupt status is not pending
\return 1 Interrupt status is pending
*/
static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
}
/** \brief Set Pending Interrupt
This function sets the pending bit for the specified interrupt.
The interrupt number cannot be a negative value.
\param [in] IRQn Number of the interrupt for set pending
*/
static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/** \brief Clear Pending Interrupt
This function clears the pending bit for the specified interrupt.
The interrupt number cannot be a negative value.
\param [in] IRQn Number of the interrupt for clear pending
*/
static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{
NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
}
/** \brief Set Interrupt Priority
This function sets the priority for the specified interrupt. The interrupt
number can be positive to specify an external (device specific)
interrupt, or negative to specify an internal (core) interrupt.
Note: The priority cannot be set for every core interrupt.
\param [in] IRQn Number of the interrupt for set priority
\param [in] priority Priority to set
*/
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if(IRQn < 0) {
SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
else {
NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
}
/** \brief Get Interrupt Priority
This function reads the priority for the specified interrupt. The interrupt
number can be positive to specify an external (device specific)
interrupt, or negative to specify an internal (core) interrupt.
The returned priority value is automatically aligned to the implemented
priority bits of the microcontroller.
\param [in] IRQn Number of the interrupt for get priority
\return Interrupt Priority
*/
static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
{
if(IRQn < 0) {
return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */
else {
return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */
}
/** \brief System Reset
This function initiate a system reset request to reset the MCU.
*/
static __INLINE void NVIC_SystemReset(void)
{
__DSB(); /* Ensure all outstanding memory accesses included
buffered write are completed before reset */
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB(); /* Ensure completion of memory access */
while(1); /* wait until reset */
}
/*@} end of CMSIS_Core_NVICFunctions */
/* ################################## SysTick function ############################################ */
/** \ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions
@{
*/
#if (__Vendor_SysTickConfig == 0)
/** \brief System Tick Configuration
This function initialises the system tick timer and its interrupt and start the system tick timer.
Counter is in free running mode to generate periodical interrupts.
\param [in] ticks Number of ticks between two interrupts
\return 0 Function succeeded
\return 1 Function failed
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
#endif
/*@} end of CMSIS_Core_SysTickFunctions */
#endif /* __CORE_CM0_H_DEPENDANT */
#endif /* __CMSIS_GENERIC */
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,609 @@
/**************************************************************************//**
* @file core_cmFunc.h
* @brief CMSIS Cortex-M Core Function Access Header File
* @version V2.10
* @date 26. July 2011
*
* @note
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
******************************************************************************/
#ifndef __CORE_CMFUNC_H
#define __CORE_CMFUNC_H
/* ########################### Core Function Access ########################### */
/** \ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
@{
*/
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
/* ARM armcc specific functions */
#if (__ARMCC_VERSION < 400677)
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
#endif
/* intrinsic void __enable_irq(); */
/* intrinsic void __disable_irq(); */
/** \brief Get Control Register
This function returns the content of the Control Register.
\return Control Register value
*/
static __INLINE uint32_t __get_CONTROL(void)
{
register uint32_t __regControl __ASM("control");
return(__regControl);
}
/** \brief Set Control Register
This function writes the given value to the Control Register.
\param [in] control Control Register value to set
*/
static __INLINE void __set_CONTROL(uint32_t control)
{
register uint32_t __regControl __ASM("control");
__regControl = control;
}
/** \brief Get ISPR Register
This function returns the content of the ISPR Register.
\return ISPR Register value
*/
static __INLINE uint32_t __get_IPSR(void)
{
register uint32_t __regIPSR __ASM("ipsr");
return(__regIPSR);
}
/** \brief Get APSR Register
This function returns the content of the APSR Register.
\return APSR Register value
*/
static __INLINE uint32_t __get_APSR(void)
{
register uint32_t __regAPSR __ASM("apsr");
return(__regAPSR);
}
/** \brief Get xPSR Register
This function returns the content of the xPSR Register.
\return xPSR Register value
*/
static __INLINE uint32_t __get_xPSR(void)
{
register uint32_t __regXPSR __ASM("xpsr");
return(__regXPSR);
}
/** \brief Get Process Stack Pointer
This function returns the current value of the Process Stack Pointer (PSP).
\return PSP Register value
*/
static __INLINE uint32_t __get_PSP(void)
{
register uint32_t __regProcessStackPointer __ASM("psp");
return(__regProcessStackPointer);
}
/** \brief Set Process Stack Pointer
This function assigns the given value to the Process Stack Pointer (PSP).
\param [in] topOfProcStack Process Stack Pointer value to set
*/
static __INLINE void __set_PSP(uint32_t topOfProcStack)
{
register uint32_t __regProcessStackPointer __ASM("psp");
__regProcessStackPointer = topOfProcStack;
}
/** \brief Get Main Stack Pointer
This function returns the current value of the Main Stack Pointer (MSP).
\return MSP Register value
*/
static __INLINE uint32_t __get_MSP(void)
{
register uint32_t __regMainStackPointer __ASM("msp");
return(__regMainStackPointer);
}
/** \brief Set Main Stack Pointer
This function assigns the given value to the Main Stack Pointer (MSP).
\param [in] topOfMainStack Main Stack Pointer value to set
*/
static __INLINE void __set_MSP(uint32_t topOfMainStack)
{
register uint32_t __regMainStackPointer __ASM("msp");
__regMainStackPointer = topOfMainStack;
}
/** \brief Get Priority Mask
This function returns the current state of the priority mask bit from the Priority Mask Register.
\return Priority Mask value
*/
static __INLINE uint32_t __get_PRIMASK(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
/** \brief Set Priority Mask
This function assigns the given value to the Priority Mask Register.
\param [in] priMask Priority Mask
*/
static __INLINE void __set_PRIMASK(uint32_t priMask)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (priMask);
}
#if (__CORTEX_M >= 0x03)
/** \brief Enable FIQ
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
#define __enable_fault_irq __enable_fiq
/** \brief Disable FIQ
This function disables FIQ interrupts by setting the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
#define __disable_fault_irq __disable_fiq
/** \brief Get Base Priority
This function returns the current value of the Base Priority register.
\return Base Priority register value
*/
static __INLINE uint32_t __get_BASEPRI(void)
{
register uint32_t __regBasePri __ASM("basepri");
return(__regBasePri);
}
/** \brief Set Base Priority
This function assigns the given value to the Base Priority register.
\param [in] basePri Base Priority value to set
*/
static __INLINE void __set_BASEPRI(uint32_t basePri)
{
register uint32_t __regBasePri __ASM("basepri");
__regBasePri = (basePri & 0xff);
}
/** \brief Get Fault Mask
This function returns the current value of the Fault Mask register.
\return Fault Mask register value
*/
static __INLINE uint32_t __get_FAULTMASK(void)
{
register uint32_t __regFaultMask __ASM("faultmask");
return(__regFaultMask);
}
/** \brief Set Fault Mask
This function assigns the given value to the Fault Mask register.
\param [in] faultMask Fault Mask value to set
*/
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
register uint32_t __regFaultMask __ASM("faultmask");
__regFaultMask = (faultMask & (uint32_t)1);
}
#endif /* (__CORTEX_M >= 0x03) */
#if (__CORTEX_M == 0x04)
/** \brief Get FPSCR
This function returns the current value of the Floating Point Status/Control register.
\return Floating Point Status/Control register value
*/
static __INLINE uint32_t __get_FPSCR(void)
{
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
register uint32_t __regfpscr __ASM("fpscr");
return(__regfpscr);
#else
return(0);
#endif
}
/** \brief Set FPSCR
This function assigns the given value to the Floating Point Status/Control register.
\param [in] fpscr Floating Point Status/Control value to set
*/
static __INLINE void __set_FPSCR(uint32_t fpscr)
{
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
register uint32_t __regfpscr __ASM("fpscr");
__regfpscr = (fpscr);
#endif
}
#endif /* (__CORTEX_M == 0x04) */
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
/* IAR iccarm specific functions */
#include <cmsis_iar.h>
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
/* GNU gcc specific functions */
/** \brief Enable IRQ Interrupts
This function enables IRQ interrupts by clearing the I-bit in the CPSR.
Can only be executed in Privileged modes.
*/
__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void)
{
__ASM volatile ("cpsie i");
}
/** \brief Disable IRQ Interrupts
This function disables IRQ interrupts by setting the I-bit in the CPSR.
Can only be executed in Privileged modes.
*/
__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void)
{
__ASM volatile ("cpsid i");
}
/** \brief Get Control Register
This function returns the content of the Control Register.
\return Control Register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void)
{
uint32_t result;
__ASM volatile ("MRS %0, control" : "=r" (result) );
return(result);
}
/** \brief Set Control Register
This function writes the given value to the Control Register.
\param [in] control Control Register value to set
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control)
{
__ASM volatile ("MSR control, %0" : : "r" (control) );
}
/** \brief Get ISPR Register
This function returns the content of the ISPR Register.
\return ISPR Register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void)
{
uint32_t result;
__ASM volatile ("MRS %0, ipsr" : "=r" (result) );
return(result);
}
/** \brief Get APSR Register
This function returns the content of the APSR Register.
\return APSR Register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void)
{
uint32_t result;
__ASM volatile ("MRS %0, apsr" : "=r" (result) );
return(result);
}
/** \brief Get xPSR Register
This function returns the content of the xPSR Register.
\return xPSR Register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void)
{
uint32_t result;
__ASM volatile ("MRS %0, xpsr" : "=r" (result) );
return(result);
}
/** \brief Get Process Stack Pointer
This function returns the current value of the Process Stack Pointer (PSP).
\return PSP Register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void)
{
register uint32_t result;
__ASM volatile ("MRS %0, psp\n" : "=r" (result) );
return(result);
}
/** \brief Set Process Stack Pointer
This function assigns the given value to the Process Stack Pointer (PSP).
\param [in] topOfProcStack Process Stack Pointer value to set
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack)
{
__ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );
}
/** \brief Get Main Stack Pointer
This function returns the current value of the Main Stack Pointer (MSP).
\return MSP Register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void)
{
register uint32_t result;
__ASM volatile ("MRS %0, msp\n" : "=r" (result) );
return(result);
}
/** \brief Set Main Stack Pointer
This function assigns the given value to the Main Stack Pointer (MSP).
\param [in] topOfMainStack Main Stack Pointer value to set
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack)
{
__ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );
}
/** \brief Get Priority Mask
This function returns the current state of the priority mask bit from the Priority Mask Register.
\return Priority Mask value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void)
{
uint32_t result;
__ASM volatile ("MRS %0, primask" : "=r" (result) );
return(result);
}
/** \brief Set Priority Mask
This function assigns the given value to the Priority Mask Register.
\param [in] priMask Priority Mask
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask)
{
__ASM volatile ("MSR primask, %0" : : "r" (priMask) );
}
#if (__CORTEX_M >= 0x03)
/** \brief Enable FIQ
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void)
{
__ASM volatile ("cpsie f");
}
/** \brief Disable FIQ
This function disables FIQ interrupts by setting the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void)
{
__ASM volatile ("cpsid f");
}
/** \brief Get Base Priority
This function returns the current value of the Base Priority register.
\return Base Priority register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void)
{
uint32_t result;
__ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
return(result);
}
/** \brief Set Base Priority
This function assigns the given value to the Base Priority register.
\param [in] basePri Base Priority value to set
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value)
{
__ASM volatile ("MSR basepri, %0" : : "r" (value) );
}
/** \brief Get Fault Mask
This function returns the current value of the Fault Mask register.
\return Fault Mask register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void)
{
uint32_t result;
__ASM volatile ("MRS %0, faultmask" : "=r" (result) );
return(result);
}
/** \brief Set Fault Mask
This function assigns the given value to the Fault Mask register.
\param [in] faultMask Fault Mask value to set
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
}
#endif /* (__CORTEX_M >= 0x03) */
#if (__CORTEX_M == 0x04)
/** \brief Get FPSCR
This function returns the current value of the Floating Point Status/Control register.
\return Floating Point Status/Control register value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void)
{
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
uint32_t result;
__ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
return(result);
#else
return(0);
#endif
}
/** \brief Set FPSCR
This function assigns the given value to the Floating Point Status/Control register.
\param [in] fpscr Floating Point Status/Control value to set
*/
__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr)
{
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );
#endif
}
#endif /* (__CORTEX_M == 0x04) */
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
/* TASKING carm specific functions */
/*
* The CMSIS functions have been implemented as intrinsics in the compiler.
* Please use "carm -?i" to get an up to date list of all instrinsics,
* Including the CMSIS ones.
*/
#endif
/*@} end of CMSIS_Core_RegAccFunctions */
#endif /* __CORE_CMFUNC_H */

View File

@@ -0,0 +1,585 @@
/**************************************************************************//**
* @file core_cmInstr.h
* @brief CMSIS Cortex-M Core Instruction Access Header File
* @version V2.10
* @date 19. July 2011
*
* @note
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
******************************************************************************/
#ifndef __CORE_CMINSTR_H
#define __CORE_CMINSTR_H
/* ########################## Core Instruction Access ######################### */
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
Access to dedicated instructions
@{
*/
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
/* ARM armcc specific functions */
#if (__ARMCC_VERSION < 400677)
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
#endif
/** \brief No Operation
No Operation does nothing. This instruction can be used for code alignment purposes.
*/
#define __NOP __nop
/** \brief Wait For Interrupt
Wait For Interrupt is a hint instruction that suspends execution
until one of a number of events occurs.
*/
#define __WFI __wfi
/** \brief Wait For Event
Wait For Event is a hint instruction that permits the processor to enter
a low-power state until one of a number of events occurs.
*/
#define __WFE __wfe
/** \brief Send Event
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
*/
#define __SEV __sev
/** \brief Instruction Synchronization Barrier
Instruction Synchronization Barrier flushes the pipeline in the processor,
so that all instructions following the ISB are fetched from cache or
memory, after the instruction has been completed.
*/
#define __ISB() __isb(0xF)
/** \brief Data Synchronization Barrier
This function acts as a special kind of Data Memory Barrier.
It completes when all explicit memory accesses before this instruction complete.
*/
#define __DSB() __dsb(0xF)
/** \brief Data Memory Barrier
This function ensures the apparent order of the explicit memory operations before
and after the instruction, without ensuring their completion.
*/
#define __DMB() __dmb(0xF)
/** \brief Reverse byte order (32 bit)
This function reverses the byte order in integer value.
\param [in] value Value to reverse
\return Reversed value
*/
#define __REV __rev
/** \brief Reverse byte order (16 bit)
This function reverses the byte order in two unsigned short values.
\param [in] value Value to reverse
\return Reversed value
*/
static __INLINE __ASM uint32_t __REV16(uint32_t value)
{
rev16 r0, r0
bx lr
}
/** \brief Reverse byte order in signed short value
This function reverses the byte order in a signed short value with sign extension to integer.
\param [in] value Value to reverse
\return Reversed value
*/
static __INLINE __ASM int32_t __REVSH(int32_t value)
{
revsh r0, r0
bx lr
}
#if (__CORTEX_M >= 0x03)
/** \brief Reverse bit order of value
This function reverses the bit order of the given value.
\param [in] value Value to reverse
\return Reversed value
*/
#define __RBIT __rbit
/** \brief LDR Exclusive (8 bit)
This function performs a exclusive LDR command for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
/** \brief LDR Exclusive (16 bit)
This function performs a exclusive LDR command for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
/** \brief LDR Exclusive (32 bit)
This function performs a exclusive LDR command for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
/** \brief STR Exclusive (8 bit)
This function performs a exclusive STR command for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#define __STREXB(value, ptr) __strex(value, ptr)
/** \brief STR Exclusive (16 bit)
This function performs a exclusive STR command for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#define __STREXH(value, ptr) __strex(value, ptr)
/** \brief STR Exclusive (32 bit)
This function performs a exclusive STR command for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#define __STREXW(value, ptr) __strex(value, ptr)
/** \brief Remove the exclusive lock
This function removes the exclusive lock which is created by LDREX.
*/
#define __CLREX __clrex
/** \brief Signed Saturate
This function saturates a signed value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (1..32)
\return Saturated value
*/
#define __SSAT __ssat
/** \brief Unsigned Saturate
This function saturates an unsigned value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (0..31)
\return Saturated value
*/
#define __USAT __usat
/** \brief Count leading zeros
This function counts the number of leading zeros of a data value.
\param [in] value Value to count the leading zeros
\return number of leading zeros in value
*/
#define __CLZ __clz
#endif /* (__CORTEX_M >= 0x03) */
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
/* IAR iccarm specific functions */
#include <cmsis_iar.h>
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
/* GNU gcc specific functions */
/** \brief No Operation
No Operation does nothing. This instruction can be used for code alignment purposes.
*/
__attribute__( ( always_inline ) ) static __INLINE void __NOP(void)
{
__ASM volatile ("nop");
}
/** \brief Wait For Interrupt
Wait For Interrupt is a hint instruction that suspends execution
until one of a number of events occurs.
*/
__attribute__( ( always_inline ) ) static __INLINE void __WFI(void)
{
__ASM volatile ("wfi");
}
/** \brief Wait For Event
Wait For Event is a hint instruction that permits the processor to enter
a low-power state until one of a number of events occurs.
*/
__attribute__( ( always_inline ) ) static __INLINE void __WFE(void)
{
__ASM volatile ("wfe");
}
/** \brief Send Event
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
*/
__attribute__( ( always_inline ) ) static __INLINE void __SEV(void)
{
__ASM volatile ("sev");
}
/** \brief Instruction Synchronization Barrier
Instruction Synchronization Barrier flushes the pipeline in the processor,
so that all instructions following the ISB are fetched from cache or
memory, after the instruction has been completed.
*/
__attribute__( ( always_inline ) ) static __INLINE void __ISB(void)
{
__ASM volatile ("isb");
}
/** \brief Data Synchronization Barrier
This function acts as a special kind of Data Memory Barrier.
It completes when all explicit memory accesses before this instruction complete.
*/
__attribute__( ( always_inline ) ) static __INLINE void __DSB(void)
{
__ASM volatile ("dsb");
}
/** \brief Data Memory Barrier
This function ensures the apparent order of the explicit memory operations before
and after the instruction, without ensuring their completion.
*/
__attribute__( ( always_inline ) ) static __INLINE void __DMB(void)
{
__ASM volatile ("dmb");
}
/** \brief Reverse byte order (32 bit)
This function reverses the byte order in integer value.
\param [in] value Value to reverse
\return Reversed value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value)
{
uint32_t result;
__ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/** \brief Reverse byte order (16 bit)
This function reverses the byte order in two unsigned short values.
\param [in] value Value to reverse
\return Reversed value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value)
{
uint32_t result;
__ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/** \brief Reverse byte order in signed short value
This function reverses the byte order in a signed short value with sign extension to integer.
\param [in] value Value to reverse
\return Reversed value
*/
__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value)
{
uint32_t result;
__ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
#if (__CORTEX_M >= 0x03)
/** \brief Reverse bit order of value
This function reverses the bit order of the given value.
\param [in] value Value to reverse
\return Reversed value
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value)
{
uint32_t result;
__ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/** \brief LDR Exclusive (8 bit)
This function performs a exclusive LDR command for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr)
{
uint8_t result;
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
return(result);
}
/** \brief LDR Exclusive (16 bit)
This function performs a exclusive LDR command for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr)
{
uint16_t result;
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
return(result);
}
/** \brief LDR Exclusive (32 bit)
This function performs a exclusive LDR command for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr)
{
uint32_t result;
__ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
return(result);
}
/** \brief STR Exclusive (8 bit)
This function performs a exclusive STR command for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
{
uint32_t result;
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
/** \brief STR Exclusive (16 bit)
This function performs a exclusive STR command for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
{
uint32_t result;
__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
/** \brief STR Exclusive (32 bit)
This function performs a exclusive STR command for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
{
uint32_t result;
__ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
/** \brief Remove the exclusive lock
This function removes the exclusive lock which is created by LDREX.
*/
__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void)
{
__ASM volatile ("clrex");
}
/** \brief Signed Saturate
This function saturates a signed value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (1..32)
\return Saturated value
*/
#define __SSAT(ARG1,ARG2) \
({ \
uint32_t __RES, __ARG1 = (ARG1); \
__ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
__RES; \
})
/** \brief Unsigned Saturate
This function saturates an unsigned value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (0..31)
\return Saturated value
*/
#define __USAT(ARG1,ARG2) \
({ \
uint32_t __RES, __ARG1 = (ARG1); \
__ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
__RES; \
})
/** \brief Count leading zeros
This function counts the number of leading zeros of a data value.
\param [in] value Value to count the leading zeros
\return number of leading zeros in value
*/
__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value)
{
uint8_t result;
__ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
#endif /* (__CORTEX_M >= 0x03) */
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
/* TASKING carm specific functions */
/*
* The CMSIS functions have been implemented as intrinsics in the compiler.
* Please use "carm -?i" to get an up to date list of all intrinsics,
* Including the CMSIS ones.
*/
#endif
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
#endif /* __CORE_CMINSTR_H */

View File

@@ -0,0 +1,256 @@
;******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
;* File Name : startup_stm32f0xx.s
;* Author : MCD Application Team
;* Version : V1.0.0
;* Date : 23-March-2012
;* Description : STM32F0xx Devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM0 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
; @attention
;
; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
; You may not use this file except in compliance with the License.
; You may obtain a copy of the License at:
;
; http://www.st.com/software_license_agreement_liberty_v2
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
;*******************************************************************************
;
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD RTC_IRQHandler ; RTC through EXTI Line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1
DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3
DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15
DCD TS_IRQHandler ; TS
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3
DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5
DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2
DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC
DCD 0 ; Reserved
DCD TIM14_IRQHandler ; TIM14
DCD TIM15_IRQHandler ; TIM15
DCD TIM16_IRQHandler ; TIM16
DCD TIM17_IRQHandler ; TIM17
DCD I2C1_IRQHandler ; I2C1
DCD I2C2_IRQHandler ; I2C2
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD 0 ; Reserved
DCD CEC_IRQHandler ; CEC
DCD 0 ; Reserved
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler routine
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_1_IRQHandler [WEAK]
EXPORT EXTI2_3_IRQHandler [WEAK]
EXPORT EXTI4_15_IRQHandler [WEAK]
EXPORT TS_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_5_IRQHandler [WEAK]
EXPORT ADC1_COMP_IRQHandler [WEAK]
EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM14_IRQHandler [WEAK]
EXPORT TIM15_IRQHandler [WEAK]
EXPORT TIM16_IRQHandler [WEAK]
EXPORT TIM17_IRQHandler [WEAK]
EXPORT I2C1_IRQHandler [WEAK]
EXPORT I2C2_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT CEC_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_1_IRQHandler
EXTI2_3_IRQHandler
EXTI4_15_IRQHandler
TS_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_3_IRQHandler
DMA1_Channel4_5_IRQHandler
ADC1_COMP_IRQHandler
TIM1_BRK_UP_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM6_DAC_IRQHandler
TIM14_IRQHandler
TIM15_IRQHandler
TIM16_IRQHandler
TIM17_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
CEC_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****

View File

@@ -0,0 +1,50 @@
#include "stm32f0xx.h"
#include "delay.h"
//===================================================================================================
/* 函数:
描述: 命令调用
注意事项:
申明:深圳尚视界科技有限公司 2008-2020 版权所有,盗版必究)
公司网站: www.sun-lcm.com
淘宝网站: https://shop151604432.taobao.com/index.htm?spm=a1z10.5-c.w5002-14603162597.2.4c2619d6w9oYgh
技术支持:<3A>QQ:3085638545
*/
//====================================================================================================
void KeyInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOB时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* 配置LED相应引脚PB1*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
unsigned char GetKeyVal(void)
{
unsigned char ucTmp;
ucTmp = GPIOA->IDR & 0x3f;
if(ucTmp != 0x3f){
delay_ms(20);
ucTmp = GPIOA->IDR & 0x3f;
if(ucTmp != 0x3f){
if( ucTmp == 0x00){ return 1;}
if( ucTmp == 0x02){ return 2;}
if( ucTmp == 0x04){ return 3;}
if( ucTmp == 0x08){ return 4;}
if( ucTmp == 0x10){ return 5;}
if( ucTmp == 0x20){ return 6;}
}
}
}

View File

@@ -0,0 +1,427 @@
#include "USART1.h"
typedef unsigned long uint32;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//本程序用于简单验证/测试尚视界JC系列集成串口模块
//STM32F030开发板
//尚视界科技@工程部
//公司网站:www.sun-lcm.com
//淘宝店https://shop151604432.taobao.com
//阿里企业店https://sundisplay2008.1688.com
//业务支持:潘生 mobile:13509671256 QQ:3167153224
//技术支持:梁生 QQ:3085638545
//修改日期:2015/09/18
//版本V1.0
//版权所有,盗版必究。
//Copyright(C) 尚视界科技有限公司 2015-2021
//All rights reserved
//******************************************************************************************************
//V1.0修改说明
//初版
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef d in stdio.h. */
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while(!((USART1->ISR)&(1<<7))){}
USART1->TDR=ch;
return (ch);
}
#endif
#define u8 unsigned char
/////////////////////////////////////////////////////////////////////////////////////
//STM32串口初始化函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.baud是使用到的波特率
/////////////////////////////////////////////////////////////////////////////////////
/* USART初始化 */
void USART1_Init(uint32_t baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART的时钟
/* USART1的端口配置 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置PA9成第二功能引脚 TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置PA10成第二功能引脚 RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
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);
/* USART1的基本配置 */
USART_InitStructure.USART_BaudRate = baud; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能接收中断
USART_Cmd(USART1, ENABLE); //使能USART1
/* USART1的NVIC中断配置 */
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//_KEY_STEP PA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/////////////////////////////////////////////////////////////////////////////////////
//获取串口字符函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.接收到的字符返回给上一层函数
//////////////////////////////////////////////////////////////////////////////////////
int UartGet (void) {
while (!(USART1->ISR & USART_FLAG_RXNE));
return ((int)(USART1->TDR & 0x1FF));
}
extern u8 rx_flag_finished;
extern u8 RX_BUF[];
extern u8 rx_count;
extern u8 ok;
/////////////////////////////////////////////////////////////////////////////////////
//获取就绪状态函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.串口中断方式接收"OK\r\n"
//4.置位ok全局变量直到ok变量设置为0x0f正常获取"OK\r\n",函数正常退出,否则进入死循环
//////////////////////////////////////////////////////////////////////////////////////
void CheckBusy(void)
{
while(1)
{
if(ok==0x0f)
break;
}
ok=0;
}
void get_var(unsigned char *val)
{
for(;;)
{
if((RX_BUF[0]=='V')&&(RX_BUF[1]=='A')&&(RX_BUF[2]=='R'))
{
RX_BUF[0]=0;
RX_BUF[1]=0;
RX_BUF[2]=0;
val[0]=RX_BUF[3];
val[1]=RX_BUF[4];
val[2]=RX_BUF[5];
val[3]=RX_BUF[6];
rx_flag_finished=0;
rx_count=0;
break;
}
}
}
char rch[5][3]; //xxx:xxx,xxx,xxx,xxx
u8 i=0;
u8 p=0;//
u8 cmd=0; //==1
u8 cmdok=0; //==1
u8 ok=0x00;
/////////////////////////////////////////////////////////////////////////////////////
//解析模块发送回来的字符函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.置位ok全局变量和抽取VAR变量的ASCII 字符
//////////////////////////////////////////////////////////////////////////////////////
void getch(u8 c)
{
if (c=='{')
{ i=0;
cmd=1;
p=0;
}
else if(c=='}')
{ cmd=0;
cmdok=1;
}
else if((c==':')||(c==','))
{
p++;
i=0;
}
else if (cmd==1)
{
if (i<3) rch[p][i]=c;
i++;
}
else if(c=='O')
{
ok=(ok&0x00)|(0x01);
}
else if(c=='K')
{
ok=(ok&0x0d)|(0x02);
}
else if(c=='\r')
{
ok=(ok&0x0b)|(0x04);
}
else if(c=='\n')
{
ok=(ok&0x07)|(0x08);
}
}
unsigned char val[4];
/////////////////////////////////////////////////////////////////////////////////////
//VAR变量二次解析函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.VAR变量的ASCII 字符转换为val值并返回给上一层函数
//////////////////////////////////////////////////////////////////////////////////////
unsigned char GetValue(void)
{
unsigned char m,n;
while(1)
{
if(cmdok==1)
{
if ((rch[0][0]=='V')&&(rch[0][1]=='A')&&(rch[0][2]=='R'))
{
/*第一个字节*/
if ((rch[1][2]>=0x30) && (rch[1][2]<=0x39))//100以上的数
{
val[0]=(rch[1][0]-0x30)*100+(rch[1][1]-0x30)*10+(rch[1][2]-0x30);
}
else if((rch[1][1]>=0x30) && (rch[1][1]<=0x39)) //10以上的数
{
val[0]=(rch[1][0]-0x30)*10+(rch[1][1]-0x30);
}
else if((rch[1][0]>=0x30) && (rch[1][0]<=0x39))
{
val[0]=(rch[1][0]-0x30);
}
/*第二个字节*/
if ((rch[2][2]>=0x30) && (rch[2][2]<=0x39))//100以上的数
{
val[1]=(rch[2][0]-0x30)*100+(rch[2][1]-0x30)*10+(rch[2][2]-0x30);
}
else if((rch[2][1]>=0x30) && (rch[2][1]<=0x39)) //10以上的数
{
val[1]=(rch[2][0]-0x30)*10+(rch[2][1]-0x30);
}
else if((rch[2][0]>=0x30) && (rch[2][0]<=0x39))
{
val[1]=(rch[2][0]-0x30);
}
/*第三个字节*/
if ((rch[3][2]>=0x30) && (rch[3][2]<=0x39))//100以上的数
{
val[2]=(rch[3][0]-0x30)*100+(rch[3][1]-0x30)*10+(rch[3][2]-0x30);
}
else if((rch[3][1]>=0x30) && (rch[3][1]<=0x39)) //10以上的数
{
val[2]=(rch[3][0]-0x30)*10+(rch[3][1]-0x30);
}
else if((rch[3][0]>=0x30) && (rch[3][0]<=0x39))
{
val[2]=(rch[3][0]-0x30);
}
/*第四个字节*/
if ((rch[4][2]>=0x30) && (rch[4][2]<=0x39))//100以上的数
{
val[3]=(rch[4][0]-0x30)*100+(rch[4][1]-0x30)*10+(rch[4][2]-0x30);
}
else if((rch[4][1]>=0x30) && (rch[4][1]<=0x39)) //10以上的数
{
val[3]=(rch[4][0]-0x30)*10+(rch[4][1]-0x30);
}
else if((rch[4][0]>=0x30) && (rch[4][0]<=0x39))
{
val[3]=(rch[4][0]-0x30);
}
for(n=0;n<5;n++)
for(m=0;m<3;m++)
rch[n][m]=0;
cmdok=0;
break;
}
// cmdok=0;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////
//串口发送数据函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.连续发送字符串,直到字符串结束
//4. databuf 为要发送字符串的地址
//////////////////////////////////////////////////////////////////////////////////////
void UartSend(char * databuf)
{
u8 i=0;
while (1)
{
if ((*databuf)!=0)//直到数据都发送完成
{
USART_SendData(USART1, *databuf); //发送一个字节数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}; //
databuf++;//i++;
}
else return;
}
}
/////////////////////////////////////////////////////////////////////////////////////
//串口接收中断函数
//1.接线方式 TX-->TX RX->RX
//2.串口初始化 模块的默认设置为 115200 8位数据位 1开始位 1停止位 无奇偶校验
//3.获取每一个字符并进行解析
//////////////////////////////////////////////////////////////////////////////////////
u8 RX_BUF[4];
u8 rx_flag_finished=0;
u8 rx_count=0;
void USART1_IRQHandler(void) //??1??????
{
u8 Res=1;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //????(?????????0x0d 0x0a??)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //????????
getch(Res);
// if(rx_flag_finished!=0xc0)//?????
// {
// if(rx_flag_finished&0x40)//????0x0d
// {
// if(Res==0x0a)
// {
// rx_flag_finished|=0x80; //????? rx_flag_finished=0xc0
// RX_BUF[rx_count]='\0'; //??????????????
// }
// else
// {
// rx_flag_finished=0;//????,????
// rx_count=0;
// }
// }
// else //????0X0D
// {
// if(Res!=0x0d)
// {
// RX_BUF[rx_count++]=Res ;
// }
// else
// {
// rx_flag_finished|=0x40;
// }
// }
// }
// if(Res=='O')
// busy_flag=0;
// else
// busy_flag=1;
}
}
#if 0
//=============================================================================
//文件名称:
//功能概要USART1中断函数
//参数说明:无
//函数返回:无
//=============================================================================
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_SendData(USART1,USART_ReceiveData(USART1));
while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
}
#endif

View File

@@ -0,0 +1,11 @@
#ifndef _USART1_H
#define _USART1_H
#include "stm32f0xx.h"
#include <stdio.h>
void USART1_Init(uint32_t baud);
#endif

View File

@@ -0,0 +1,41 @@
#include "USART1.h"
#define KEY1_COMM1 {0xEB,0x4B,0x07,0xF8,0xC0,0x88,0x22,0x88,0x66,0x2A,0x2D,0x41}
const unsigned char Key1Com1[] = {0xEB,0x4B,0x07,0xF8,0xC0,0x88,0x22,0x88,0x66,0x2A,0x2D,0x41};
const unsigned char Key1Com2[] = {0xEB,0x4B,0x07,0xF8,0xB9,0x3B,0x48,0x33,0x65,0xDD,0x4B,0x6E,0x3A,0x7F,0x71,0x10,0x31,0x87,0x4A};
const unsigned char KeyComm[2][20] = {
{0xEB,0x4B,0x07,0xF8,0xC0,0x88,0x22,0x88,0x66,0x2A,0x2D,0x41}
};
typedef struct Command{
unsigned char KeyCom1;
unsigned char KeyCom2;
}sKeyCommand_t;
//sKeyCommand_t sKeyCommand[] = {
//(0xEB,0x4B,0x07,0xF8,0xC0,0x88,0x22,0x88,0x66,0x2A,0x2D,0x41,}
//};
typedef struct keyPross{
unsigned char KeyTime;
unsigned char KeyVal;
void (*UartPrintf)(unsigned char*);
}sKeyPross_t;
sKeyPross_t sKeyPross;
void OutputCommand(unsigned char KeyVal, unsigned char KeyTime)
{
}
void Init_API(void)
{
sKeyPross.UartPrintf = printf;
}
void OutputCommand_Uart1(sKeyPross_t sKeyPross)
{
sKeyPross.UartPrintf("123");
}

View File

@@ -0,0 +1,39 @@
#include "LED.h"
#if 0
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(LED_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
/****************************************************
函数功能LED开
输入参数:无
输出参数:无
备 注调用此函数前需要在LED.h修改宏定义LED引脚
****************************************************/
void LED_ON(void)
{
GPIO_ResetBits(LED_PORT, LED_PIN);
}
/****************************************************
函数功能LED关
输入参数:无
输出参数:无
备 注调用此函数前需要在LED.h修改宏定义LED引脚
****************************************************/
void LED_OFF(void)
{
GPIO_SetBits(LED_PORT, LED_PIN);
}
#endif

View File

@@ -0,0 +1,29 @@
#ifndef __LED_H
#define __LED_H
//===================================================================================================
/* 函数:
描述: 命令调用
注意事项:
申明:深圳尚视界科技有限公司 2008-2020 版权所有,盗版必究)
公司网站: www.sun-lcm.com
淘宝网站: https://shop151604432.taobao.com/index.htm?spm=a1z10.5-c.w5002-14603162597.2.4c2619d6w9oYgh
技术支持:<3A>QQ:3085638545
*/
//====================================================================================================
#include "stm32f0xx.h"
#define LED_GPIO_CLK RCC_AHBPeriph_GPIOA
#define LED_PORT GPIOA
#define LED_PIN GPIO_Pin_4
void LED_Init(void);
void LED_ON(void);
void LED_OFF(void);
#endif

View File

@@ -0,0 +1,936 @@
ARM Macro Assembler Page 1
1 00000000 ;******************** (C) COPYRIGHT 2012 STMicroelectron
ics ********************
2 00000000 ;* File Name : startup_stm32f0xx.s
3 00000000 ;* Author : MCD Application Team
4 00000000 ;* Version : V1.0.0
5 00000000 ;* Date : 23-March-2012
6 00000000 ;* Description : STM32F0xx Devices vector table f
or MDK-ARM toolchain.
7 00000000 ;* This module performs:
8 00000000 ;* - Set the initial SP
9 00000000 ;* - Set the initial PC == Reset_Ha
ndler
10 00000000 ;* - Set the vector table entries w
ith the exceptions ISR address
11 00000000 ;* - Branches to __main in the C li
brary (which eventually
12 00000000 ;* calls main()).
13 00000000 ;* After Reset the CortexM0 process
or is in Thread mode,
14 00000000 ;* priority is Privileged, and the
Stack is set to Main.
15 00000000 ;* <<< Use Configuration Wizard in Context Menu >>>
16 00000000 ;*******************************************************
************************
17 00000000 ; @attention
18 00000000 ;
19 00000000 ; Licensed under MCD-ST Liberty SW License Agreement V2
, (the "License");
20 00000000 ; You may not use this file except in compliance with t
he License.
21 00000000 ; You may obtain a copy of the License at:
22 00000000 ;
23 00000000 ; http://www.st.com/software_license_agreement_l
iberty_v2
24 00000000 ;
25 00000000 ; Unless required by applicable law or agreed to in wri
ting, software
26 00000000 ; distributed under the License is distributed on an "A
S IS" BASIS,
27 00000000 ; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied.
28 00000000 ; See the License for the specific language governing p
ermissions and
29 00000000 ; limitations under the License.
30 00000000 ;
31 00000000 ;*******************************************************
************************
32 00000000 ;
33 00000000 ; Amount of memory (in bytes) allocated for Stack
34 00000000 ; Tailor this value to your application needs
35 00000000 ; <h> Stack Configuration
36 00000000 ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
37 00000000 ; </h>
38 00000000
39 00000000 00000400
Stack_Size
EQU 0x00000400
40 00000000
41 00000000 AREA STACK, NOINIT, READWRITE, ALIGN
ARM Macro Assembler Page 2
=3
42 00000000 Stack_Mem
SPACE Stack_Size
43 00000400 __initial_sp
44 00000400
45 00000400
46 00000400 ; <h> Heap Configuration
47 00000400 ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
48 00000400 ; </h>
49 00000400
50 00000400 00000200
Heap_Size
EQU 0x00000200
51 00000400
52 00000400 AREA HEAP, NOINIT, READWRITE, ALIGN=
3
53 00000000 __heap_base
54 00000000 Heap_Mem
SPACE Heap_Size
55 00000200 __heap_limit
56 00000200
57 00000200 PRESERVE8
58 00000200 THUMB
59 00000200
60 00000200
61 00000200 ; Vector Table Mapped to Address 0 at Reset
62 00000200 AREA RESET, DATA, READONLY
63 00000000 EXPORT __Vectors
64 00000000 EXPORT __Vectors_End
65 00000000 EXPORT __Vectors_Size
66 00000000
67 00000000 00000000
__Vectors
DCD __initial_sp ; Top of Stack
68 00000004 00000000 DCD Reset_Handler ; Reset Handler
69 00000008 00000000 DCD NMI_Handler ; NMI Handler
70 0000000C 00000000 DCD HardFault_Handler ; Hard Fault
Handler
71 00000010 00000000 DCD 0 ; Reserved
72 00000014 00000000 DCD 0 ; Reserved
73 00000018 00000000 DCD 0 ; Reserved
74 0000001C 00000000 DCD 0 ; Reserved
75 00000020 00000000 DCD 0 ; Reserved
76 00000024 00000000 DCD 0 ; Reserved
77 00000028 00000000 DCD 0 ; Reserved
78 0000002C 00000000 DCD SVC_Handler ; SVCall Handler
79 00000030 00000000 DCD 0 ; Reserved
80 00000034 00000000 DCD 0 ; Reserved
81 00000038 00000000 DCD PendSV_Handler ; PendSV Handler
82 0000003C 00000000 DCD SysTick_Handler
; SysTick Handler
83 00000040
84 00000040 ; External Interrupts
85 00000040 00000000 DCD WWDG_IRQHandler
; Window Watchdog
86 00000044 00000000 DCD PVD_IRQHandler ; PVD through EX
TI Line detect
87 00000048 00000000 DCD RTC_IRQHandler ; RTC through EX
ARM Macro Assembler Page 3
TI Line
88 0000004C 00000000 DCD FLASH_IRQHandler ; FLASH
89 00000050 00000000 DCD RCC_IRQHandler ; RCC
90 00000054 00000000 DCD EXTI0_1_IRQHandler
; EXTI Line 0 and 1
91 00000058 00000000 DCD EXTI2_3_IRQHandler
; EXTI Line 2 and 3
92 0000005C 00000000 DCD EXTI4_15_IRQHandler
; EXTI Line 4 to 15
93 00000060 00000000 DCD TS_IRQHandler ; TS
94 00000064 00000000 DCD DMA1_Channel1_IRQHandler
; DMA1 Channel 1
95 00000068 00000000 DCD DMA1_Channel2_3_IRQHandler ; DM
A1 Channel 2 and Ch
annel 3
96 0000006C 00000000 DCD DMA1_Channel4_5_IRQHandler ; DM
A1 Channel 4 and Ch
annel 5
97 00000070 00000000 DCD ADC1_COMP_IRQHandler ; ADC1, CO
MP1 and COMP2
98 00000074 00000000 DCD TIM1_BRK_UP_TRG_COM_IRQHandler
; TIM1 Break, Updat
e, Trigger and Comm
utation
99 00000078 00000000 DCD TIM1_CC_IRQHandler ; TIM1 Captu
re Compare
100 0000007C 00000000 DCD TIM2_IRQHandler ; TIM2
101 00000080 00000000 DCD TIM3_IRQHandler ; TIM3
102 00000084 00000000 DCD TIM6_DAC_IRQHandler
; TIM6 and DAC
103 00000088 00000000 DCD 0 ; Reserved
104 0000008C 00000000 DCD TIM14_IRQHandler ; TIM14
105 00000090 00000000 DCD TIM15_IRQHandler ; TIM15
106 00000094 00000000 DCD TIM16_IRQHandler ; TIM16
107 00000098 00000000 DCD TIM17_IRQHandler ; TIM17
108 0000009C 00000000 DCD I2C1_IRQHandler ; I2C1
109 000000A0 00000000 DCD I2C2_IRQHandler ; I2C2
110 000000A4 00000000 DCD SPI1_IRQHandler ; SPI1
111 000000A8 00000000 DCD SPI2_IRQHandler ; SPI2
112 000000AC 00000000 DCD USART1_IRQHandler ; USART1
113 000000B0 00000000 DCD USART2_IRQHandler ; USART2
114 000000B4 00000000 DCD 0 ; Reserved
115 000000B8 00000000 DCD CEC_IRQHandler ; CEC
116 000000BC 00000000 DCD 0 ; Reserved
117 000000C0
118 000000C0 __Vectors_End
119 000000C0
120 000000C0 000000C0
__Vectors_Size
EQU __Vectors_End - __Vectors
121 000000C0
122 000000C0 AREA |.text|, CODE, READONLY
123 00000000
124 00000000 ; Reset handler routine
125 00000000 Reset_Handler
PROC
ARM Macro Assembler Page 4
126 00000000 EXPORT Reset_Handler [
WEAK]
127 00000000 IMPORT __main
128 00000000 IMPORT SystemInit
129 00000000 4807 LDR R0, =SystemInit
130 00000002 4780 BLX R0
131 00000004 4807 LDR R0, =__main
132 00000006 4700 BX R0
133 00000008 ENDP
134 00000008
135 00000008 ; Dummy Exception Handlers (infinite loops which can be
modified)
136 00000008
137 00000008 NMI_Handler
PROC
138 00000008 EXPORT NMI_Handler
[WEAK]
139 00000008 E7FE B .
140 0000000A ENDP
142 0000000A HardFault_Handler
PROC
143 0000000A EXPORT HardFault_Handler
[WEAK]
144 0000000A E7FE B .
145 0000000C ENDP
146 0000000C SVC_Handler
PROC
147 0000000C EXPORT SVC_Handler
[WEAK]
148 0000000C E7FE B .
149 0000000E ENDP
150 0000000E PendSV_Handler
PROC
151 0000000E EXPORT PendSV_Handler
[WEAK]
152 0000000E E7FE B .
153 00000010 ENDP
154 00000010 SysTick_Handler
PROC
155 00000010 EXPORT SysTick_Handler
[WEAK]
156 00000010 E7FE B .
157 00000012 ENDP
158 00000012
159 00000012 Default_Handler
PROC
160 00000012
161 00000012 EXPORT WWDG_IRQHandler
[WEAK]
162 00000012 EXPORT PVD_IRQHandler
[WEAK]
163 00000012 EXPORT RTC_IRQHandler
[WEAK]
164 00000012 EXPORT FLASH_IRQHandler
[WEAK]
165 00000012 EXPORT RCC_IRQHandler
[WEAK]
166 00000012 EXPORT EXTI0_1_IRQHandler
[WEAK]
ARM Macro Assembler Page 5
167 00000012 EXPORT EXTI2_3_IRQHandler
[WEAK]
168 00000012 EXPORT EXTI4_15_IRQHandler
[WEAK]
169 00000012 EXPORT TS_IRQHandler
[WEAK]
170 00000012 EXPORT DMA1_Channel1_IRQHandler
[WEAK]
171 00000012 EXPORT DMA1_Channel2_3_IRQHandler
[WEAK]
172 00000012 EXPORT DMA1_Channel4_5_IRQHandler
[WEAK]
173 00000012 EXPORT ADC1_COMP_IRQHandler
[WEAK]
174 00000012 EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler
[WEAK]
175 00000012 EXPORT TIM1_CC_IRQHandler
[WEAK]
176 00000012 EXPORT TIM2_IRQHandler
[WEAK]
177 00000012 EXPORT TIM3_IRQHandler
[WEAK]
178 00000012 EXPORT TIM6_DAC_IRQHandler
[WEAK]
179 00000012 EXPORT TIM14_IRQHandler
[WEAK]
180 00000012 EXPORT TIM15_IRQHandler
[WEAK]
181 00000012 EXPORT TIM16_IRQHandler
[WEAK]
182 00000012 EXPORT TIM17_IRQHandler
[WEAK]
183 00000012 EXPORT I2C1_IRQHandler
[WEAK]
184 00000012 EXPORT I2C2_IRQHandler
[WEAK]
185 00000012 EXPORT SPI1_IRQHandler
[WEAK]
186 00000012 EXPORT SPI2_IRQHandler
[WEAK]
187 00000012 EXPORT USART1_IRQHandler
[WEAK]
188 00000012 EXPORT USART2_IRQHandler
[WEAK]
189 00000012 EXPORT CEC_IRQHandler
[WEAK]
190 00000012
191 00000012
192 00000012 WWDG_IRQHandler
193 00000012 PVD_IRQHandler
194 00000012 RTC_IRQHandler
195 00000012 FLASH_IRQHandler
196 00000012 RCC_IRQHandler
197 00000012 EXTI0_1_IRQHandler
198 00000012 EXTI2_3_IRQHandler
199 00000012 EXTI4_15_IRQHandler
200 00000012 TS_IRQHandler
201 00000012 DMA1_Channel1_IRQHandler
202 00000012 DMA1_Channel2_3_IRQHandler
ARM Macro Assembler Page 6
203 00000012 DMA1_Channel4_5_IRQHandler
204 00000012 ADC1_COMP_IRQHandler
205 00000012 TIM1_BRK_UP_TRG_COM_IRQHandler
206 00000012 TIM1_CC_IRQHandler
207 00000012 TIM2_IRQHandler
208 00000012 TIM3_IRQHandler
209 00000012 TIM6_DAC_IRQHandler
210 00000012 TIM14_IRQHandler
211 00000012 TIM15_IRQHandler
212 00000012 TIM16_IRQHandler
213 00000012 TIM17_IRQHandler
214 00000012 I2C1_IRQHandler
215 00000012 I2C2_IRQHandler
216 00000012 SPI1_IRQHandler
217 00000012 SPI2_IRQHandler
218 00000012 USART1_IRQHandler
219 00000012 USART2_IRQHandler
220 00000012 CEC_IRQHandler
221 00000012
222 00000012 E7FE B .
223 00000014
224 00000014 ENDP
225 00000014
226 00000014 ALIGN
227 00000014
228 00000014 ;*******************************************************
************************
229 00000014 ; User Stack and Heap initialization
230 00000014 ;*******************************************************
************************
231 00000014 IF :DEF:__MICROLIB
238 00000014
239 00000014 IMPORT __use_two_region_memory
240 00000014 EXPORT __user_initial_stackheap
241 00000014
242 00000014 __user_initial_stackheap
243 00000014
244 00000014 4804 LDR R0, = Heap_Mem
245 00000016 4905 LDR R1, =(Stack_Mem + Stack_Size)
246 00000018 4A05 LDR R2, = (Heap_Mem + Heap_Size)
247 0000001A 4B06 LDR R3, = Stack_Mem
248 0000001C 4770 BX LR
249 0000001E
250 0000001E 00 00 ALIGN
251 00000020
252 00000020 ENDIF
253 00000020
254 00000020 END
00000000
00000000
00000000
00000400
00000200
00000000
Command Line: --debug --xref --cpu=Cortex-M0 --apcs=interwork --depend=..\obj\s
tartup_stm32f0xx.d -o..\obj\startup_stm32f0xx.o -IC:\Keil\ARM\RV31\INC -IC:\Kei
l\ARM\PACK\ARM\CMSIS\3.20.3\CMSIS\Include -IC:\Keil\ARM\PACK\Keil\STM32F0xx_DFP
\1.0.0\Device\Include --list=.\startup_stm32f0xx.lst ..\CORE\startup_stm32f0xx.
s
ARM Macro Assembler Page 1 Alphabetic symbol ordering
Relocatable symbols
STACK 00000000
Symbol: STACK
Definitions
At line 41 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: STACK unused
Stack_Mem 00000000
Symbol: Stack_Mem
Definitions
At line 42 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 245 in file ..\CORE\startup_stm32f0xx.s
At line 247 in file ..\CORE\startup_stm32f0xx.s
__initial_sp 00000400
Symbol: __initial_sp
Definitions
At line 43 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 67 in file ..\CORE\startup_stm32f0xx.s
Comment: __initial_sp used once
3 symbols
ARM Macro Assembler Page 1 Alphabetic symbol ordering
Relocatable symbols
HEAP 00000000
Symbol: HEAP
Definitions
At line 52 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: HEAP unused
Heap_Mem 00000000
Symbol: Heap_Mem
Definitions
At line 54 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 244 in file ..\CORE\startup_stm32f0xx.s
At line 246 in file ..\CORE\startup_stm32f0xx.s
__heap_base 00000000
Symbol: __heap_base
Definitions
At line 53 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: __heap_base unused
__heap_limit 00000200
Symbol: __heap_limit
Definitions
At line 55 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: __heap_limit unused
4 symbols
ARM Macro Assembler Page 1 Alphabetic symbol ordering
Relocatable symbols
RESET 00000000
Symbol: RESET
Definitions
At line 62 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: RESET unused
__Vectors 00000000
Symbol: __Vectors
Definitions
At line 67 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 63 in file ..\CORE\startup_stm32f0xx.s
At line 120 in file ..\CORE\startup_stm32f0xx.s
__Vectors_End 000000C0
Symbol: __Vectors_End
Definitions
At line 118 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 64 in file ..\CORE\startup_stm32f0xx.s
At line 120 in file ..\CORE\startup_stm32f0xx.s
3 symbols
ARM Macro Assembler Page 1 Alphabetic symbol ordering
Relocatable symbols
.text 00000000
Symbol: .text
Definitions
At line 122 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: .text unused
ADC1_COMP_IRQHandler 00000012
Symbol: ADC1_COMP_IRQHandler
Definitions
At line 204 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 97 in file ..\CORE\startup_stm32f0xx.s
At line 173 in file ..\CORE\startup_stm32f0xx.s
CEC_IRQHandler 00000012
Symbol: CEC_IRQHandler
Definitions
At line 220 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 115 in file ..\CORE\startup_stm32f0xx.s
At line 189 in file ..\CORE\startup_stm32f0xx.s
DMA1_Channel1_IRQHandler 00000012
Symbol: DMA1_Channel1_IRQHandler
Definitions
At line 201 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 94 in file ..\CORE\startup_stm32f0xx.s
At line 170 in file ..\CORE\startup_stm32f0xx.s
DMA1_Channel2_3_IRQHandler 00000012
Symbol: DMA1_Channel2_3_IRQHandler
Definitions
At line 202 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 95 in file ..\CORE\startup_stm32f0xx.s
At line 171 in file ..\CORE\startup_stm32f0xx.s
DMA1_Channel4_5_IRQHandler 00000012
Symbol: DMA1_Channel4_5_IRQHandler
Definitions
At line 203 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 96 in file ..\CORE\startup_stm32f0xx.s
At line 172 in file ..\CORE\startup_stm32f0xx.s
Default_Handler 00000012
Symbol: Default_Handler
Definitions
At line 159 in file ..\CORE\startup_stm32f0xx.s
Uses
ARM Macro Assembler Page 2 Alphabetic symbol ordering
Relocatable symbols
None
Comment: Default_Handler unused
EXTI0_1_IRQHandler 00000012
Symbol: EXTI0_1_IRQHandler
Definitions
At line 197 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 90 in file ..\CORE\startup_stm32f0xx.s
At line 166 in file ..\CORE\startup_stm32f0xx.s
EXTI2_3_IRQHandler 00000012
Symbol: EXTI2_3_IRQHandler
Definitions
At line 198 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 91 in file ..\CORE\startup_stm32f0xx.s
At line 167 in file ..\CORE\startup_stm32f0xx.s
EXTI4_15_IRQHandler 00000012
Symbol: EXTI4_15_IRQHandler
Definitions
At line 199 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 92 in file ..\CORE\startup_stm32f0xx.s
At line 168 in file ..\CORE\startup_stm32f0xx.s
FLASH_IRQHandler 00000012
Symbol: FLASH_IRQHandler
Definitions
At line 195 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 88 in file ..\CORE\startup_stm32f0xx.s
At line 164 in file ..\CORE\startup_stm32f0xx.s
HardFault_Handler 0000000A
Symbol: HardFault_Handler
Definitions
At line 142 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 70 in file ..\CORE\startup_stm32f0xx.s
At line 143 in file ..\CORE\startup_stm32f0xx.s
I2C1_IRQHandler 00000012
Symbol: I2C1_IRQHandler
Definitions
At line 214 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 108 in file ..\CORE\startup_stm32f0xx.s
At line 183 in file ..\CORE\startup_stm32f0xx.s
I2C2_IRQHandler 00000012
Symbol: I2C2_IRQHandler
ARM Macro Assembler Page 3 Alphabetic symbol ordering
Relocatable symbols
Definitions
At line 215 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 109 in file ..\CORE\startup_stm32f0xx.s
At line 184 in file ..\CORE\startup_stm32f0xx.s
NMI_Handler 00000008
Symbol: NMI_Handler
Definitions
At line 137 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 69 in file ..\CORE\startup_stm32f0xx.s
At line 138 in file ..\CORE\startup_stm32f0xx.s
PVD_IRQHandler 00000012
Symbol: PVD_IRQHandler
Definitions
At line 193 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 86 in file ..\CORE\startup_stm32f0xx.s
At line 162 in file ..\CORE\startup_stm32f0xx.s
PendSV_Handler 0000000E
Symbol: PendSV_Handler
Definitions
At line 150 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 81 in file ..\CORE\startup_stm32f0xx.s
At line 151 in file ..\CORE\startup_stm32f0xx.s
RCC_IRQHandler 00000012
Symbol: RCC_IRQHandler
Definitions
At line 196 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 89 in file ..\CORE\startup_stm32f0xx.s
At line 165 in file ..\CORE\startup_stm32f0xx.s
RTC_IRQHandler 00000012
Symbol: RTC_IRQHandler
Definitions
At line 194 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 87 in file ..\CORE\startup_stm32f0xx.s
At line 163 in file ..\CORE\startup_stm32f0xx.s
Reset_Handler 00000000
Symbol: Reset_Handler
Definitions
At line 125 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 68 in file ..\CORE\startup_stm32f0xx.s
At line 126 in file ..\CORE\startup_stm32f0xx.s
ARM Macro Assembler Page 4 Alphabetic symbol ordering
Relocatable symbols
SPI1_IRQHandler 00000012
Symbol: SPI1_IRQHandler
Definitions
At line 216 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 110 in file ..\CORE\startup_stm32f0xx.s
At line 185 in file ..\CORE\startup_stm32f0xx.s
SPI2_IRQHandler 00000012
Symbol: SPI2_IRQHandler
Definitions
At line 217 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 111 in file ..\CORE\startup_stm32f0xx.s
At line 186 in file ..\CORE\startup_stm32f0xx.s
SVC_Handler 0000000C
Symbol: SVC_Handler
Definitions
At line 146 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 78 in file ..\CORE\startup_stm32f0xx.s
At line 147 in file ..\CORE\startup_stm32f0xx.s
SysTick_Handler 00000010
Symbol: SysTick_Handler
Definitions
At line 154 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 82 in file ..\CORE\startup_stm32f0xx.s
At line 155 in file ..\CORE\startup_stm32f0xx.s
TIM14_IRQHandler 00000012
Symbol: TIM14_IRQHandler
Definitions
At line 210 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 104 in file ..\CORE\startup_stm32f0xx.s
At line 179 in file ..\CORE\startup_stm32f0xx.s
TIM15_IRQHandler 00000012
Symbol: TIM15_IRQHandler
Definitions
At line 211 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 105 in file ..\CORE\startup_stm32f0xx.s
At line 180 in file ..\CORE\startup_stm32f0xx.s
TIM16_IRQHandler 00000012
Symbol: TIM16_IRQHandler
Definitions
ARM Macro Assembler Page 5 Alphabetic symbol ordering
Relocatable symbols
At line 212 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 106 in file ..\CORE\startup_stm32f0xx.s
At line 181 in file ..\CORE\startup_stm32f0xx.s
TIM17_IRQHandler 00000012
Symbol: TIM17_IRQHandler
Definitions
At line 213 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 107 in file ..\CORE\startup_stm32f0xx.s
At line 182 in file ..\CORE\startup_stm32f0xx.s
TIM1_BRK_UP_TRG_COM_IRQHandler 00000012
Symbol: TIM1_BRK_UP_TRG_COM_IRQHandler
Definitions
At line 205 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 98 in file ..\CORE\startup_stm32f0xx.s
At line 174 in file ..\CORE\startup_stm32f0xx.s
TIM1_CC_IRQHandler 00000012
Symbol: TIM1_CC_IRQHandler
Definitions
At line 206 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 99 in file ..\CORE\startup_stm32f0xx.s
At line 175 in file ..\CORE\startup_stm32f0xx.s
TIM2_IRQHandler 00000012
Symbol: TIM2_IRQHandler
Definitions
At line 207 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 100 in file ..\CORE\startup_stm32f0xx.s
At line 176 in file ..\CORE\startup_stm32f0xx.s
TIM3_IRQHandler 00000012
Symbol: TIM3_IRQHandler
Definitions
At line 208 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 101 in file ..\CORE\startup_stm32f0xx.s
At line 177 in file ..\CORE\startup_stm32f0xx.s
TIM6_DAC_IRQHandler 00000012
Symbol: TIM6_DAC_IRQHandler
Definitions
At line 209 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 102 in file ..\CORE\startup_stm32f0xx.s
At line 178 in file ..\CORE\startup_stm32f0xx.s
ARM Macro Assembler Page 6 Alphabetic symbol ordering
Relocatable symbols
TS_IRQHandler 00000012
Symbol: TS_IRQHandler
Definitions
At line 200 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 93 in file ..\CORE\startup_stm32f0xx.s
At line 169 in file ..\CORE\startup_stm32f0xx.s
USART1_IRQHandler 00000012
Symbol: USART1_IRQHandler
Definitions
At line 218 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 112 in file ..\CORE\startup_stm32f0xx.s
At line 187 in file ..\CORE\startup_stm32f0xx.s
USART2_IRQHandler 00000012
Symbol: USART2_IRQHandler
Definitions
At line 219 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 113 in file ..\CORE\startup_stm32f0xx.s
At line 188 in file ..\CORE\startup_stm32f0xx.s
WWDG_IRQHandler 00000012
Symbol: WWDG_IRQHandler
Definitions
At line 192 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 85 in file ..\CORE\startup_stm32f0xx.s
At line 161 in file ..\CORE\startup_stm32f0xx.s
__user_initial_stackheap 00000014
Symbol: __user_initial_stackheap
Definitions
At line 242 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 240 in file ..\CORE\startup_stm32f0xx.s
Comment: __user_initial_stackheap used once
38 symbols
ARM Macro Assembler Page 1 Alphabetic symbol ordering
Absolute symbols
Heap_Size 00000200
Symbol: Heap_Size
Definitions
At line 50 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 54 in file ..\CORE\startup_stm32f0xx.s
At line 246 in file ..\CORE\startup_stm32f0xx.s
Stack_Size 00000400
Symbol: Stack_Size
Definitions
At line 39 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 42 in file ..\CORE\startup_stm32f0xx.s
At line 245 in file ..\CORE\startup_stm32f0xx.s
__Vectors_Size 000000C0
Symbol: __Vectors_Size
Definitions
At line 120 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 65 in file ..\CORE\startup_stm32f0xx.s
Comment: __Vectors_Size used once
3 symbols
ARM Macro Assembler Page 1 Alphabetic symbol ordering
External symbols
SystemInit 00000000
Symbol: SystemInit
Definitions
At line 128 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 129 in file ..\CORE\startup_stm32f0xx.s
Comment: SystemInit used once
__main 00000000
Symbol: __main
Definitions
At line 127 in file ..\CORE\startup_stm32f0xx.s
Uses
At line 131 in file ..\CORE\startup_stm32f0xx.s
Comment: __main used once
__use_two_region_memory 00000000
Symbol: __use_two_region_memory
Definitions
At line 239 in file ..\CORE\startup_stm32f0xx.s
Uses
None
Comment: __use_two_region_memory unused
3 symbols
388 symbols in table

View File

@@ -0,0 +1,26 @@
<html>
<body>
<pre>
<h1>µVision Build Log</h1>
<h2>Project:</h2>
E:\SSJ ÏîÄ¿×ÊÁÏ\SSJ ÏîÄ¿×ÊÁÏ\ÏÔʾÆÁÄ£¿é ÏîÄ¿\³ÌÐò\Ä£¿é²âÊÔ³ÌÐò\2.4\CN2048 оƬ²âÊÔ´úÂë\STM32F030´®¿Ú\User\STM32F030Demo.uvproj
Project File Date: 11/14/2018
<h2>Output:</h2>
Build target 'Stm32f030demo'
linking...
..\OBJ\STM32F030Demo.axf: Error: L6218E: Undefined symbol GetKeyVal (referred from main.o).
..\OBJ\STM32F030Demo.axf: Error: L6218E: Undefined symbol KeyInit (referred from main.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 2 error messages.
"..\OBJ\STM32F030Demo.axf" - 2 Error(s), 0 Warning(s).
Target not created
</pre>
</body>
</html>
ain.o).
..\OBJ\STM32F030Demo.axf: Error: L6218E: Undefined symbol KeyInit (referred from main.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 2 error messages.
"..\OBJ\STM32F030Demo.axf" - 2 Error(s), 0 Warning(s).
Target not created

View File

@@ -0,0 +1,803 @@
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html><head>
<title>Static Call Graph - [..\OBJ\STM32F030Demo.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image ..\OBJ\STM32F030Demo.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5040049: Last Updated: Wed Nov 14 16:32:57 2018
<BR><P>
<H3>Maximum Stack Usage = 136 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
__rt_entry_main &rArr; main &rArr; __2printf &rArr; _printf_char_file &rArr; _printf_char_common &rArr; __printf
<P>
<H3>
Functions with no stack information
</H3><UL>
<LI><a href="#[2f]">__user_initial_stackheap</a>
</UL>
</UL>
<P>
<H3>
Mutually Recursive functions
</H3> <LI><a href="#[18]">ADC1_COMP_IRQHandler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[18]">ADC1_COMP_IRQHandler</a><BR>
</UL>
<P>
<H3>
Function Pointers
</H3><UL>
<LI><a href="#[18]">ADC1_COMP_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[28]">CEC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[15]">DMA1_Channel1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[16]">DMA1_Channel2_3_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[17]">DMA1_Channel4_5_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[11]">EXTI0_1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[12]">EXTI2_3_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[13]">EXTI4_15_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[f]">FLASH_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[8]">HardFault_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[22]">I2C1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[23]">I2C2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[7]">NMI_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[d]">PVD_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[a]">PendSV_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[10]">RCC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[e]">RTC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[2d]">Reset_Handler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[24]">SPI1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[25]">SPI2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[9]">SVC_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[b]">SysTick_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[29]">SystemInit</a> from system_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(.text)
<LI><a href="#[1e]">TIM14_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1f]">TIM15_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[20]">TIM16_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[21]">TIM17_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[19]">TIM1_BRK_UP_TRG_COM_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1a]">TIM1_CC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1b]">TIM2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1c]">TIM3_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1d]">TIM6_DAC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[14]">TS_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[26]">USART1_IRQHandler</a> from usart1.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[27]">USART2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[c]">WWDG_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[2e]">__main</a> from __main.o(!!!main) referenced from startup_stm32f0xx.o(.text)
<LI><a href="#[2c]">_printf_input_char</a> from _printf_char_common.o(.text) referenced from _printf_char_common.o(.text)
<LI><a href="#[2b]">fputc</a> from usart1.o(.text) referenced from _printf_char_file.o(.text)
</UL>
<P>
<H3>
Global Symbols
</H3>
<P><STRONG><a name="[2e]"></a>__main</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, __main.o(!!!main))
<BR><BR>[Calls]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry
<LI><a href="#[30]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
</UL>
<P><STRONG><a name="[30]"></a>__scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter))
<BR><BR>[Called By]<UL><LI><a href="#[2e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main
</UL>
<P><STRONG><a name="[32]"></a>__scatterload_rt2</STRONG> (Thumb, 52 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry
</UL>
<P><STRONG><a name="[67]"></a>__scatterload_rt2_thumb_only</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED)
<P><STRONG><a name="[68]"></a>__scatterload_null</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED)
<P><STRONG><a name="[33]"></a>__scatterload_copy</STRONG> (Thumb, 26 bytes, Stack size unknown bytes, __scatter_copy.o(!!handler_copy), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[33]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload_copy
</UL>
<BR>[Called By]<UL><LI><a href="#[33]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload_copy
</UL>
<P><STRONG><a name="[69]"></a>__scatterload_zeroinit</STRONG> (Thumb, 28 bytes, Stack size unknown bytes, __scatter_zi.o(!!handler_zi), UNUSED)
<P><STRONG><a name="[63]"></a>_printf_percent</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, _printf_percent.o(.ARM.Collect$$_printf_percent$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__printf
</UL>
<P><STRONG><a name="[6a]"></a>_printf_percent_end</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, _printf_percent_end.o(.ARM.Collect$$_printf_percent$$00000017))
<P><STRONG><a name="[37]"></a>__rt_lib_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit.o(.ARM.Collect$$libinit$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[36]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_li
</UL>
<P><STRONG><a name="[6b]"></a>__rt_lib_init_fp_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000001))
<P><STRONG><a name="[6c]"></a>__rt_lib_init_alloca_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002C))
<P><STRONG><a name="[6d]"></a>__rt_lib_init_argv_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002A))
<P><STRONG><a name="[6e]"></a>__rt_lib_init_atexit_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000019))
<P><STRONG><a name="[6f]"></a>__rt_lib_init_clock_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001F))
<P><STRONG><a name="[70]"></a>__rt_lib_init_cpp_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000030))
<P><STRONG><a name="[71]"></a>__rt_lib_init_exceptions_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002E))
<P><STRONG><a name="[72]"></a>__rt_lib_init_fp_trap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001D))
<P><STRONG><a name="[73]"></a>__rt_lib_init_getenv_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000021))
<P><STRONG><a name="[74]"></a>__rt_lib_init_heap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000008))
<P><STRONG><a name="[75]"></a>__rt_lib_init_lc_collate_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000F))
<P><STRONG><a name="[76]"></a>__rt_lib_init_lc_ctype_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000011))
<P><STRONG><a name="[77]"></a>__rt_lib_init_lc_monetary_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000013))
<P><STRONG><a name="[78]"></a>__rt_lib_init_lc_numeric_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000015))
<P><STRONG><a name="[79]"></a>__rt_lib_init_lc_time_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000017))
<P><STRONG><a name="[7a]"></a>__rt_lib_init_rand_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000C))
<P><STRONG><a name="[7b]"></a>__rt_lib_init_return</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000031))
<P><STRONG><a name="[7c]"></a>__rt_lib_init_signal_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001B))
<P><STRONG><a name="[7d]"></a>__rt_lib_init_stdio_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000023))
<P><STRONG><a name="[7e]"></a>__rt_lib_init_user_alloc_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000A))
<P><STRONG><a name="[3c]"></a>__rt_lib_shutdown</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown.o(.ARM.Collect$$libshutdown$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_exit_ls
</UL>
<P><STRONG><a name="[7f]"></a>__rt_lib_shutdown_fp_trap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000006))
<P><STRONG><a name="[80]"></a>__rt_lib_shutdown_heap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000E))
<P><STRONG><a name="[81]"></a>__rt_lib_shutdown_return</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F))
<P><STRONG><a name="[82]"></a>__rt_lib_shutdown_signal_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000009))
<P><STRONG><a name="[83]"></a>__rt_lib_shutdown_stdio_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000003))
<P><STRONG><a name="[84]"></a>__rt_lib_shutdown_user_alloc_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000B))
<P><STRONG><a name="[31]"></a>__rt_entry</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry.o(.ARM.Collect$$rtentry$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[2e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main
<LI><a href="#[32]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload_rt2
</UL>
<P><STRONG><a name="[85]"></a>__rt_entry_presh_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$00000002))
<P><STRONG><a name="[34]"></a>__rt_entry_sh</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry4.o(.ARM.Collect$$rtentry$$00000004))
<BR><BR>[Stack]<UL><LI>Max Depth = 8 + Unknown Stack Size
<LI>Call Chain = __rt_entry_sh &rArr; __user_setup_stackheap
</UL>
<BR>[Calls]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_setup_stackheap
</UL>
<P><STRONG><a name="[36]"></a>__rt_entry_li</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$0000000A))
<BR><BR>[Calls]<UL><LI><a href="#[37]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_lib_init
</UL>
<P><STRONG><a name="[86]"></a>__rt_entry_postsh_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$00000009))
<P><STRONG><a name="[38]"></a>__rt_entry_main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$0000000D))
<BR><BR>[Stack]<UL><LI>Max Depth = 136 + Unknown Stack Size
<LI>Call Chain = __rt_entry_main &rArr; main &rArr; __2printf &rArr; _printf_char_file &rArr; _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;exit
</UL>
<P><STRONG><a name="[87]"></a>__rt_entry_postli_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$0000000C))
<P><STRONG><a name="[66]"></a>__rt_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit.o(.ARM.Collect$$rtexit$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;exit
</UL>
<P><STRONG><a name="[3b]"></a>__rt_exit_ls</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000003))
<BR><BR>[Calls]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_lib_shutdown
</UL>
<P><STRONG><a name="[88]"></a>__rt_exit_prels_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000002))
<P><STRONG><a name="[3d]"></a>__rt_exit_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000004))
<BR><BR>[Calls]<UL><LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_sys_exit
</UL>
<P><STRONG><a name="[39]"></a>main</STRONG> (Thumb, 328 bytes, Stack size 0 bytes, main.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 136 + Unknown Stack Size
<LI>Call Chain = main &rArr; __2printf &rArr; _printf_char_file &rArr; _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_ms
<LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_init
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LED_Init
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;KeyInit
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GetKeyVal
</UL>
<BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_main
</UL>
<P><STRONG><a name="[7]"></a>NMI_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[8]"></a>HardFault_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[9]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[a]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[b]"></a>SysTick_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[29]"></a>SystemInit</STRONG> (Thumb, 110 bytes, Stack size 8 bytes, system_stm32f0xx.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = SystemInit &rArr; SetSysClock
</UL>
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SetSysClock
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(.text)
</UL>
<P><STRONG><a name="[47]"></a>SystemCoreClockUpdate</STRONG> (Thumb, 154 bytes, Stack size 24 bytes, system_stm32f0xx.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<P><STRONG><a name="[2d]"></a>Reset_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<P><STRONG><a name="[18]"></a>ADC1_COMP_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR><BR>[Calls]<UL><LI><a href="#[18]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC1_COMP_IRQHandler
</UL>
<BR>[Called By]<UL><LI><a href="#[18]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC1_COMP_IRQHandler
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[28]"></a>CEC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[15]"></a>DMA1_Channel1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[16]"></a>DMA1_Channel2_3_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[17]"></a>DMA1_Channel4_5_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[11]"></a>EXTI0_1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[12]"></a>EXTI2_3_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[13]"></a>EXTI4_15_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[f]"></a>FLASH_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[22]"></a>I2C1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[23]"></a>I2C2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[d]"></a>PVD_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[10]"></a>RCC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[e]"></a>RTC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[24]"></a>SPI1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[25]"></a>SPI2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1e]"></a>TIM14_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1f]"></a>TIM15_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[20]"></a>TIM16_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[21]"></a>TIM17_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[19]"></a>TIM1_BRK_UP_TRG_COM_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1a]"></a>TIM1_CC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1b]"></a>TIM2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1c]"></a>TIM3_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1d]"></a>TIM6_DAC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[14]"></a>TS_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[27]"></a>USART2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[c]"></a>WWDG_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[2f]"></a>__user_initial_stackheap</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, startup_stm32f0xx.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_setup_stackheap
</UL>
<P><STRONG><a name="[40]"></a>LED_Init</STRONG> (Thumb, 42 bytes, Stack size 16 bytes, led.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 36<LI>Call Chain = LED_Init &rArr; GPIO_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[3e]"></a>_sys_exit</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, usart1.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_exit_exit
</UL>
<P><STRONG><a name="[2b]"></a>fputc</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, usart1.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> _printf_char_file.o(.text)
</UL>
<P><STRONG><a name="[42]"></a>USART1_Init</STRONG> (Thumb, 144 bytes, Stack size 48 bytes, usart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = USART1_Init &rArr; USART_Init &rArr; RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Init
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_ITConfig
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Cmd
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB2PeriphClockCmd
<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_Init
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_PinAFConfig
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[26]"></a>USART1_IRQHandler</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, usart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = USART1_IRQHandler &rArr; USART_GetITStatus
</UL>
<BR>[Calls]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_SendData
<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_ReceiveData
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_GetITStatus
<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_GetFlagStatus
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[41]"></a>KeyInit</STRONG> (Thumb, 40 bytes, Stack size 16 bytes, key.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 36<LI>Call Chain = KeyInit &rArr; GPIO_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[44]"></a>GetKeyVal</STRONG> (Thumb, 92 bytes, Stack size 8 bytes, key.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = GetKeyVal
</UL>
<BR>[Calls]<UL><LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_ms
</UL>
<BR>[Called By]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[3f]"></a>delay_init</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, delay.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = delay_init
</UL>
<BR>[Calls]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_CLKSourceConfig
</UL>
<BR>[Called By]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[89]"></a>delay_us</STRONG> (Thumb, 74 bytes, Stack size 0 bytes, delay.o(.text), UNUSED)
<P><STRONG><a name="[45]"></a>delay_ms</STRONG> (Thumb, 74 bytes, Stack size 0 bytes, delay.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GetKeyVal
<LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[56]"></a>GPIO_DeInit</STRONG> (Thumb, 132 bytes, Stack size 8 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphResetCmd
</UL>
<P><STRONG><a name="[4a]"></a>GPIO_Init</STRONG> (Thumb, 144 bytes, Stack size 20 bytes, stm32f0xx_gpio.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LED_Init
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;KeyInit
</UL>
<P><STRONG><a name="[8a]"></a>GPIO_StructInit</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[8b]"></a>GPIO_PinLockConfig</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[8c]"></a>GPIO_ReadInputDataBit</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[8d]"></a>GPIO_ReadInputData</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[8e]"></a>GPIO_ReadOutputDataBit</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[8f]"></a>GPIO_ReadOutputData</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[90]"></a>GPIO_SetBits</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[91]"></a>GPIO_ResetBits</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[92]"></a>GPIO_WriteBit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[93]"></a>GPIO_Write</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[4c]"></a>GPIO_PinAFConfig</STRONG> (Thumb, 68 bytes, Stack size 20 bytes, stm32f0xx_gpio.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = GPIO_PinAFConfig
</UL>
<BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[94]"></a>RCC_DeInit</STRONG> (Thumb, 104 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[95]"></a>RCC_HSEConfig</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[59]"></a>RCC_GetFlagStatus</STRONG> (Thumb, 68 bytes, Stack size 8 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_WaitForHSEStartUp
</UL>
<P><STRONG><a name="[58]"></a>RCC_WaitForHSEStartUp</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_GetFlagStatus
</UL>
<P><STRONG><a name="[96]"></a>RCC_AdjustHSICalibrationValue</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[97]"></a>RCC_HSICmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[98]"></a>RCC_AdjustHSI14CalibrationValue</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[99]"></a>RCC_HSI14Cmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[9a]"></a>RCC_HSI14ADCRequestCmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[9b]"></a>RCC_LSEConfig</STRONG> (Thumb, 34 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[9c]"></a>RCC_LSEDriveConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[9d]"></a>RCC_LSICmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[9e]"></a>RCC_PLLConfig</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[9f]"></a>RCC_PLLCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a0]"></a>RCC_PREDIV1Config</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a1]"></a>RCC_ClockSecuritySystemCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a2]"></a>RCC_MCOConfig</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a3]"></a>RCC_SYSCLKConfig</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a4]"></a>RCC_GetSYSCLKSource</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a5]"></a>RCC_HCLKConfig</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a6]"></a>RCC_PCLKConfig</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a7]"></a>RCC_ADCCLKConfig</STRONG> (Thumb, 52 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a8]"></a>RCC_CECCLKConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a9]"></a>RCC_I2CCLKConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[aa]"></a>RCC_USARTCLKConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[5a]"></a>RCC_GetClocksFreq</STRONG> (Thumb, 368 bytes, Stack size 32 bytes, stm32f0xx_rcc.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Init
</UL>
<P><STRONG><a name="[ab]"></a>RCC_RTCCLKConfig</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[ac]"></a>RCC_RTCCLKCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[ad]"></a>RCC_BackupResetCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[49]"></a>RCC_AHBPeriphClockCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LED_Init
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;KeyInit
</UL>
<P><STRONG><a name="[4b]"></a>RCC_APB2PeriphClockCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[ae]"></a>RCC_APB1PeriphClockCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[57]"></a>RCC_AHBPeriphResetCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_DeInit
</UL>
<P><STRONG><a name="[5c]"></a>RCC_APB2PeriphResetCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_DeInit
</UL>
<P><STRONG><a name="[5d]"></a>RCC_APB1PeriphResetCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_DeInit
</UL>
<P><STRONG><a name="[af]"></a>RCC_ITConfig</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b0]"></a>RCC_ClearFlag</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b1]"></a>RCC_GetITStatus</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b2]"></a>RCC_ClearITPendingBit</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[50]"></a>NVIC_Init</STRONG> (Thumb, 106 bytes, Stack size 0 bytes, stm32f0xx_misc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[b3]"></a>NVIC_SystemLPConfig</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_misc.o(.text), UNUSED)
<P><STRONG><a name="[55]"></a>SysTick_CLKSourceConfig</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_misc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_init
</UL>
<P><STRONG><a name="[5b]"></a>USART_DeInit</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, stm32f0xx_usart.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB1PeriphResetCmd
<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB2PeriphResetCmd
</UL>
<P><STRONG><a name="[4d]"></a>USART_Init</STRONG> (Thumb, 234 bytes, Stack size 56 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = USART_Init &rArr; RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_GetClocksFreq
</UL>
<BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[b4]"></a>USART_StructInit</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[b5]"></a>USART_ClockInit</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[b6]"></a>USART_ClockStructInit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[4f]"></a>USART_Cmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[b7]"></a>USART_DirectionModeCmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[b8]"></a>USART_OverSampling8Cmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[b9]"></a>USART_OneBitMethodCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[ba]"></a>USART_MSBFirstCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[bb]"></a>USART_DataInvCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[bc]"></a>USART_InvPinCmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[bd]"></a>USART_SWAPPinCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[be]"></a>USART_ReceiverTimeOutCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[bf]"></a>USART_SetReceiverTimeOut</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c0]"></a>USART_SetPrescaler</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c1]"></a>USART_STOPModeCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c2]"></a>USART_StopModeWakeUpSourceConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c3]"></a>USART_AutoBaudRateCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c4]"></a>USART_AutoBaudRateConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c5]"></a>USART_AutoBaudRateNewRequest</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[53]"></a>USART_SendData</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[52]"></a>USART_ReceiveData</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[c6]"></a>USART_SetAddress</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c7]"></a>USART_MuteModeCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c8]"></a>USART_MuteModeWakeUpConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c9]"></a>USART_AddressDetectionConfig</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[ca]"></a>USART_LINBreakDetectLengthConfig</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cb]"></a>USART_LINCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cc]"></a>USART_HalfDuplexCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cd]"></a>USART_SetGuardTime</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[ce]"></a>USART_SmartCardCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cf]"></a>USART_SmartCardNACKCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d0]"></a>USART_SetAutoRetryCount</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d1]"></a>USART_SetBlockLength</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d2]"></a>USART_IrDAConfig</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d3]"></a>USART_IrDACmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d4]"></a>USART_DECmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d5]"></a>USART_DEPolarityConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d6]"></a>USART_SetDEAssertionTime</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d7]"></a>USART_SetDEDeassertionTime</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d8]"></a>USART_DMACmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d9]"></a>USART_DMAReceptionErrorConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[4e]"></a>USART_ITConfig</STRONG> (Thumb, 66 bytes, Stack size 24 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = USART_ITConfig
</UL>
<BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[da]"></a>USART_RequestCmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[db]"></a>USART_OverrunDetectionConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[54]"></a>USART_GetFlagStatus</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[dc]"></a>USART_ClearFlag</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[51]"></a>USART_GetITStatus</STRONG> (Thumb, 78 bytes, Stack size 16 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = USART_GetITStatus
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[dd]"></a>USART_ClearITPendingBit</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[de]"></a>__use_no_semihosting</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, use_no_semi_2.o(.text), UNUSED)
<P><STRONG><a name="[43]"></a>__2printf</STRONG> (Thumb, 22 bytes, Stack size 24 bytes, __2printf.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 136 + Unknown Stack Size
<LI>Call Chain = __2printf &rArr; _printf_char_file &rArr; _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_file
</UL>
<BR>[Called By]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[df]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, aeabi_sdiv.o(.text), UNUSED)
<P><STRONG><a name="[48]"></a>__aeabi_uidivmod</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, aeabi_sdiv.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_GetClocksFreq
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Init
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemCoreClockUpdate
<LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_init
</UL>
<P><STRONG><a name="[e0]"></a>__aeabi_idiv</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, aeabi_sdiv.o(.text), UNUSED)
<P><STRONG><a name="[e1]"></a>__aeabi_idivmod</STRONG> (Thumb, 326 bytes, Stack size 8 bytes, aeabi_sdiv.o(.text), UNUSED)
<P><STRONG><a name="[e2]"></a>__use_two_region_memory</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED)
<P><STRONG><a name="[e3]"></a>__rt_heap_escrow$2region</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED)
<P><STRONG><a name="[e4]"></a>__rt_heap_expand$2region</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED)
<P><STRONG><a name="[e5]"></a>__I$use$semihosting</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED)
<P><STRONG><a name="[e6]"></a>__use_no_semihosting_swi</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED)
<P><STRONG><a name="[5e]"></a>_printf_char_file</STRONG> (Thumb, 34 bytes, Stack size 16 bytes, _printf_char_file.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 112 + Unknown Stack Size
<LI>Call Chain = _printf_char_file &rArr; _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ferror
<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_common
</UL>
<BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
</UL>
<P><STRONG><a name="[61]"></a>__printf</STRONG> (Thumb, 386 bytes, Stack size 32 bytes, __printf_flags_ss_wp.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 32 + Unknown Stack Size
<LI>Call Chain = __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_percent
<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_is_digit
</UL>
<BR>[Called By]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_common
</UL>
<P><STRONG><a name="[5f]"></a>_printf_char_common</STRONG> (Thumb, 32 bytes, Stack size 64 bytes, _printf_char_common.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 96 + Unknown Stack Size
<LI>Call Chain = _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__printf
</UL>
<BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_file
</UL>
<P><STRONG><a name="[60]"></a>ferror</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, ferror.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_file
</UL>
<P><STRONG><a name="[35]"></a>__user_setup_stackheap</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, sys_stackheap_outer.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8 + Unknown Stack Size
<LI>Call Chain = __user_setup_stackheap
</UL>
<BR>[Calls]<UL><LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_initial_stackheap
<LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_perproc_libspace
</UL>
<BR>[Called By]<UL><LI><a href="#[34]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_sh
</UL>
<P><STRONG><a name="[3a]"></a>exit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, exit.o(.text))
<BR><BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_exit
<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_call_atexit_fns (Weak Reference)
</UL>
<BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_main
</UL>
<P><STRONG><a name="[e7]"></a>__user_libspace</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED)
<P><STRONG><a name="[64]"></a>__user_perproc_libspace</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_setup_stackheap
</UL>
<P><STRONG><a name="[e8]"></a>__user_perthread_libspace</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED)
<P><STRONG><a name="[62]"></a>_is_digit</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, __printf_wp.o(i._is_digit))
<BR><BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__printf
</UL>
<P>
<H3>
Local Symbols
</H3>
<P><STRONG><a name="[46]"></a>SetSysClock</STRONG> (Thumb, 206 bytes, Stack size 12 bytes, system_stm32f0xx.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = SetSysClock
</UL>
<BR>[Called By]<UL><LI><a href="#[29]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemInit
</UL>
<P><STRONG><a name="[2c]"></a>_printf_input_char</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, _printf_char_common.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> _printf_char_common.o(.text)
</UL><P>
<H3>
Undefined Global Symbols
</H3>
<P><STRONG><a name="[65]"></a>_call_atexit_fns</STRONG> (ARM, 0 bytes, Stack size 0 bytes, UNDEFINED)
<BR><BR>[Called By]<UL><LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;exit
</UL>
<HR></body></html>

View File

@@ -0,0 +1,15 @@
--cpu Cortex-M0
"..\obj\main.o"
"..\obj\stm32f0xx_it.o"
"..\obj\system_stm32f0xx.o"
"..\obj\startup_stm32f0xx.o"
"..\obj\led.o"
"..\obj\usart1.o"
"..\obj\delay.o"
"..\obj\stm32f0xx_gpio.o"
"..\obj\stm32f0xx_rcc.o"
"..\obj\stm32f0xx_misc.o"
"..\obj\stm32f0xx_usart.o"
--ro-base 0x08000000 --entry 0x08000000 --rw-base 0x20000000 --entry Reset_Handler --first __Vectors --strict --summary_stderr --info summarysizes --map --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\STM32F030Demo.map" -o ..\OBJ\STM32F030Demo.axf

View File

@@ -0,0 +1,122 @@
Dependencies for Project 'STM32F030Demo', Target 'Stm32f030demo': (DO NOT MODIFY !)
F (.\main.c)(0x5F8D96A2)(-c --cpu Cortex-M0 -g -W -O0 --apcs=interwork -I ..\CORE -I ..\HARDWARE -I ..\STM32F03x_FWLib\inc -I ..\STM32F03x_FWLib\src -I ..\User -I ..\SYSTEM
-I.\RTE\_Stm32f030demo
-IF:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
-IF:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="525" -D_RTE_ -DSTM32F030x6 -DUSE_STDPERIPH_DRIVER -DSTM32F0XX
-o ..\obj\main.o --omf_browse ..\obj\main.crf --depend ..\obj\main.d)
I (stm32f0xx.h)(0x5C0F2083)
I (..\CORE\core_cm0.h)(0x574D3404)
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x599ECD2E)
I (..\CORE\core_cmInstr.h)(0x574D3404)
I (..\CORE\core_cmFunc.h)(0x574D3404)
I (system_stm32f0xx.h)(0x574D3404)
I (stm32f0xx_conf.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h)(0x574D3404)
I (..\User\stm32f0xx.h)(0x5C0F2083)
I (..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_usart.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_misc.h)(0x574D3404)
I (..\SYSTEM\delay.h)(0x574D3404)
I (..\HARDWARE\led.h)(0x5D15B711)
I (..\HARDWARE\USART1.h)(0x574D3404)
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x599ECD2C)
I (..\HARDWARE\Key.h)(0x574D3404)
F (.\stm32f0xx_it.c)(0x574D3404)(-c --cpu Cortex-M0 -g -W -O0 --apcs=interwork -I ..\CORE -I ..\HARDWARE -I ..\STM32F03x_FWLib\inc -I ..\STM32F03x_FWLib\src -I ..\User -I ..\SYSTEM
-I.\RTE\_Stm32f030demo
-IF:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
-IF:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="525" -D_RTE_ -DSTM32F030x6 -DUSE_STDPERIPH_DRIVER -DSTM32F0XX
-o ..\obj\stm32f0xx_it.o --omf_browse ..\obj\stm32f0xx_it.crf --depend ..\obj\stm32f0xx_it.d)
I (stm32f0xx_it.h)(0x574D3404)
I (stm32f0xx.h)(0x5C0F2083)
I (..\CORE\core_cm0.h)(0x574D3404)
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x599ECD2E)
I (..\CORE\core_cmInstr.h)(0x574D3404)
I (..\CORE\core_cmFunc.h)(0x574D3404)
I (system_stm32f0xx.h)(0x574D3404)
I (stm32f0xx_conf.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h)(0x574D3404)
I (..\User\stm32f0xx.h)(0x5C0F2083)
I (..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_usart.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_misc.h)(0x574D3404)
F (.\system_stm32f0xx.c)(0x574D3404)(-c --cpu Cortex-M0 -g -W -O0 --apcs=interwork -I ..\CORE -I ..\HARDWARE -I ..\STM32F03x_FWLib\inc -I ..\STM32F03x_FWLib\src -I ..\User -I ..\SYSTEM
-I.\RTE\_Stm32f030demo
-IF:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
-IF:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="525" -D_RTE_ -DSTM32F030x6 -DUSE_STDPERIPH_DRIVER -DSTM32F0XX
-o ..\obj\system_stm32f0xx.o --omf_browse ..\obj\system_stm32f0xx.crf --depend ..\obj\system_stm32f0xx.d)
I (stm32f0xx.h)(0x5C0F2083)
I (..\CORE\core_cm0.h)(0x574D3404)
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x599ECD2E)
I (..\CORE\core_cmInstr.h)(0x574D3404)
I (..\CORE\core_cmFunc.h)(0x574D3404)
I (system_stm32f0xx.h)(0x574D3404)
I (stm32f0xx_conf.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h)(0x574D3404)
I (..\User\stm32f0xx.h)(0x5C0F2083)
I (..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_usart.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_misc.h)(0x574D3404)
F (..\CORE\startup_stm32f0xx.s)(0x574D3404)(--cpu Cortex-M0 -g --apcs=interwork
-I.\RTE\_Stm32f030demo
-IF:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
-IF:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
--pd "__UVISION_VERSION SETA 525" --pd "_RTE_ SETA 1" --pd "STM32F030x6 SETA 1"
--list .\startup_stm32f0xx.lst --xref -o ..\obj\startup_stm32f0xx.o --depend ..\obj\startup_stm32f0xx.d)
F (..\HARDWARE\USART1.c)(0x5F8ABBB7)(-c --cpu Cortex-M0 -g -W -O0 --apcs=interwork -I ..\CORE -I ..\HARDWARE -I ..\STM32F03x_FWLib\inc -I ..\STM32F03x_FWLib\src -I ..\User -I ..\SYSTEM
-I.\RTE\_Stm32f030demo
-IF:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
-IF:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="525" -D_RTE_ -DSTM32F030x6 -DUSE_STDPERIPH_DRIVER -DSTM32F0XX
-o ..\obj\usart1.o --omf_browse ..\obj\usart1.crf --depend ..\obj\usart1.d)
I (..\HARDWARE\USART1.h)(0x574D3404)
I (..\User\stm32f0xx.h)(0x5C0F2083)
I (..\CORE\core_cm0.h)(0x574D3404)
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x599ECD2E)
I (..\CORE\core_cmInstr.h)(0x574D3404)
I (..\CORE\core_cmFunc.h)(0x574D3404)
I (..\User\system_stm32f0xx.h)(0x574D3404)
I (..\User\stm32f0xx_conf.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_usart.h)(0x574D3404)
I (..\STM32F03x_FWLib\inc\stm32f0xx_misc.h)(0x574D3404)
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x599ECD2C)
F (..\SYSTEM\delay.c)(0x5F72DB3A)(-c --cpu Cortex-M0 -g -W -O0 --apcs=interwork -I ..\CORE -I ..\HARDWARE -I ..\STM32F03x_FWLib\inc -I ..\STM32F03x_FWLib\src -I ..\User -I ..\SYSTEM
-I.\RTE\_Stm32f030demo
-IF:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
-IF:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="525" -D_RTE_ -DSTM32F030x6 -DUSE_STDPERIPH_DRIVER -DSTM32F0XX
-o ..\obj\delay.o --omf_browse ..\obj\delay.crf --depend ..\obj\delay.d)

View File

@@ -0,0 +1,60 @@
<html>
<body>
<pre>
<h1>礦ision Build Log</h1>
<h2>Tool Versions:</h2>
IDE-Version: μVision V5.25.2.0
Copyright (C) 2018 ARM Ltd and ARM Germany GmbH. All rights reserved.
License Information: 111 Microsoft, Microsoft, LIC=WHY45-G5GRW-G78R6-DUJKC-EYBSC-67VJZ
Tool Versions:
Toolchain: MDK-ARM Plus Version: 5.25.2.0
Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin
C Compiler: Armcc.exe V5.06 update 6 (build 750)
Assembler: Armasm.exe V5.06 update 6 (build 750)
Linker/Locator: ArmLink.exe V5.06 update 6 (build 750)
Library Manager: ArmAr.exe V5.06 update 6 (build 750)
Hex Converter: FromElf.exe V5.06 update 6 (build 750)
CPU DLL: SARMCM3.DLL V5.25.2.0
Dialog DLL: DARMCM1.DLL V1.19.1.0
Target DLL: Segger\JL2CM3.dll V2.99.29.0
Dialog DLL: TARMCM1.DLL V1.14.0.0
<h2>Project:</h2>
G:\SunDisplay\module\2020资料更新\演示例程 CN2048 带注释\JC144演示demo_ STM32F030串口 UART\JC144 STM32F030串口 UART\User\STM32F030Demo.uvprojx
Project File Date: 10/19/2020
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Stm32f030demo'
compiling main.c...
linking...
Program Size: Code=8828 RO-data=224 RW-data=60 ZI-data=1652
FromELF: creating hex file...
"..\OBJ\TEST.axf" - 0 Error(s), 0 Warning(s).
<h2>Software Packages used:</h2>
Package Vendor: ARM
http://www.keil.com/pack/ARM.CMSIS.5.3.0.pack
ARM.CMSIS.5.3.0
CMSIS (Cortex Microcontroller Software Interface Standard)
* Component: CORE Version: 5.1.1
Package Vendor: Keil
http://www.keil.com/pack/Keil.STM32F0xx_DFP.2.0.0.pack
Keil.STM32F0xx_DFP.2.0.0
STMicroelectronics STM32F0 Series Device Support, Drivers and Examples
<h2>Collection of Component include folders:</h2>
.\RTE\_Stm32f030demo
F:\tool_setup\ARM\CMSIS\5.3.0\CMSIS\Include
F:\tool_setup\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
<h2>Collection of Component Files used:</h2>
* Component: ARM::CMSIS:CORE:5.1.1
Build Time Elapsed: 00:00:01
</pre>
</body>
</html>

View File

@@ -0,0 +1,573 @@
:020000040800F2
:10000000B0060020990A0008950800089708000823
:1000100000000000000000000000000000000000E0
:100020000000000000000000000000009B08000825
:1000300000000000000000009D0800089F08000864
:10004000AB0A0008AB0A0008AB0A0008AB0A0008BC
:10005000AB0A0008AB0A0008AB0A0008AB0A0008AC
:10006000AB0A0008AB0A0008AB0A0008AB0A00089C
:10007000AB0A0008AB0A0008AB0A0008AB0A00088C
:10008000AB0A0008AB0A000800000000AB0A000839
:10009000AB0A0008AB0A0008AB0A0008AB0A00086C
:1000A000AB0A0008AB0A0008AB0A0008570F0008AB
:1000B000AB0A000800000000AB0A000800000000C6
:1000C00000F002F800F046F80CA030C808382418F8
:1000D0002D18A246671EAB4654465D46AC4201D180
:1000E00000F038F87E460F3E0FCCB646012633426C
:1000F00000D0FB1AA246AB4633431847402200000B
:1001000060220000103A02D378C878C1FAD85207AA
:1001100001D330C830C101D504680C6070470000BD
:100120000023002400250026103A01D378C1FBD813
:10013000520700D330C100D50B60704710B5642959
:1001400002D101F0D1FE10BD002010BD1FB51FBDB2
:1001500010B510BD02F0BFF81146FFF7F7FF00F031
:1001600009F802F0D7F803B4FFF7F2FF03BC00F080
:10017000AFFC0000A0B000F007FF7D20C00000F041
:100180003EFFE120400200F0B0FC00BFFF20F53050
:1001900000F035FF00250EE0E80301214905421873
:1001A000A0A1684601F064FE684600F0BEFE00F0C3
:1001B000FDFC681CC5B2072DEEDB4B20000100F0F2
:1001C0001EFFA1A000F0B1FE00F0F0FCAAA000F01C
:1001D000ACFE00F0EBFCA8A000F0A7FE00F0E6FCEF
:1001E000ABA000F0A2FE00F0E1FCAFA000F09DFE8D
:1001F00000F0DCFCB2A000F098FE00F0D7FCB6A046
:1002000000F093FE00F0D2FCB9A000F08EFE00F0EA
:10021000CDFCBEA000F089FE00F0C8FCC0A000F03C
:1002200084FE00F0C3FCC3A000F07FFE00F0BEFC23
:10023000C6A000F07AFE00F0B9FCCAA000F075FE7E
:1002400000F0B4FCCBA000F070FE00F0AFFCCFA03B
:1002500000F06BFE00F0AAFCD1A000F066FE00F0FA
:10026000A5FC1920800100F0CAFE77A000F05DFE19
:1002700000F09CFC80A000F058FE00F097FC84A0E9
:1002800000F053FE00F092FC87A000F04EFE00F05C
:100290008DFC8BA000F049FE00F088FC8EA000F0E1
:1002A00044FE00F083FC92A000F03FFE00F07EFCD4
:1002B000C0A000F03AFE00F079FCC4A000F035FECA
:1002C00000F074FCC9A000F030FE00F06FFCCDA07F
:1002D00000F02BFE00F06AFCD0A000F026FE00F03B
:1002E00065FC1920800100F08AFED4A000F01DFEFC
:1002F00000F05CFCDDA000F018FE00F057FCE3A06D
:1003000000F013FE00F052FCE7A000F00EFE00F03B
:100310004DFCECA000F009FE00F048FC002400BFFA
:1003200010E02246EDA1684601F0A2FD601CC4B2B7
:10033000642000F064FE684600F0F7FD00F036FC33
:10034000601CC4B23C2CECDD002400BF2EE0224631
:10035000EAA1684601F08CFD601CC4B2642000F084
:100360004EFE684600F0E1FD00F020FC2246EBA1C5
:10037000684601F07DFD601CC4B2642000F03FFEC1
:10038000684600F0D2FD00F011FC2246EBA1684661
:1003900001F06EFD601CC4B2642000F030FE6846BF
:1003A00000F0C3FD00F002FC601CC4B2322CCEDDB4
:1003B0001920800100F023FEE8A000F0B6FD00F057
:1003C000F5FB28242246F1A1684601F051FD68465C
:1003D00000F0ABFD00F0EAFB7D20C00000F00FFE56
:1003E0007F242246F3A1684601F042FD684600F0F2
:1003F0009CFD00F0DBFB7D20C00000F000FEC82467
:100400002246F6A1684601F033FD684600F08DFDF6
:1004100000F0CCFB7D20C00000F0F1FD002422465E
:10042000F0E100004449522831293B4653494D47E9
:10043000282532642C302C302C3132382C31323893
:100440002C30293B0D0A00004449522831293B43F6
:100450004C522830293B444331362831302C352C3E
:1004600027C9EEDBDAC9D0CAD3BDE7BFC6BCBC27FB
:100470002C34293B0D0A0000504C28302C33302CF2
:100480003132372C33302C3135293B0D0A00000036
:10049000504C28302C3132372C3132372C31323716
:1004A0002C3135293B0D0A00504C28302C37352C87
:1004B0003132372C37352C3135293B0D0A000000FD
:1004C000504C28302C33302C302C3132372C3135F5
:1004D000293B0D0A00000000504C2836352C3330E3
:1004E0002C36352C3132372C3135293B0D0A0000A2
:1004F000504C283132372C33302C3132372C3132BA
:10050000372C3135293B0D0A0000000043495228A1
:1005100033322C35302C31352C31293B0D0A00007B
:10052000434952462834322C35302C31352C32296F
:100530003B0D0A00424F58462838302C33392C31B5
:1005400031302C36302C33293B0D0A00424F5828CD
:1005500039302C33392C3132302C36302C31293B88
:100560000D0A000050532834302C39302C32293BEE
:100570000D0A0000504C2831352C3130352C3630E6
:100580002C3130352C31293B0D0A000043495228CB
:1005900039302C3130352C31352C31293B0D0A00C6
:1005A0005053283132302C3130352C3234293B0D28
:1005B0000A000000444331362831302C34352C27D2
:1005C000414243272C33293B0D0A00005342432864
:1005D0003135293B44435631362834302C34352CC0
:1005E00027414243272C30293B0D0A004443323433
:1005F0002838302C34302C27313233272C32293B09
:100600000D0A0000444356333228332C38352C274A
:10061000C9EEDBDA272C32293B0D0A00534243286E
:1006200031293B444332342837352C38352C27D6F2
:10063000D0B9FA272C31293B0D0A0000434C52282F
:1006400030293B4449522831293B4653494D4728DC
:10065000323332363532382C302C302C3132382C83
:100660003132382C30293B0D0A000000444332342B
:1006700028352C302C27323031392D30382D32307E
:1006800020272C3135293B0D0A0000004443313628
:1006900028352C33352C2720D0C7C6DAB6FE272CB8
:1006A0003135293B0D0A0000444331362836302CC1
:1006B00033352C2720323020A3BA272C3135293B63
:1006C0000D0A0000504C28302C33302C3132382C9D
:1006D00033302C3135293B0D0A00000053424328AA
:1006E0003135293B4443563136283130352C3335AA
:1006F0002C272564272C31293B0D0A00534243281F
:100700003135293B44435631362831352C37302C8E
:10071000272564272C31293B0D0A0000534243282A
:100720003135293B44435631362835322C37302C6D
:10073000272564272C31293B0D0A0000534243280A
:100740003135293B44435631362839352C37302C46
:10075000272564272C31293B0D0A0000434C5228E1
:1007600030293B4449522831293B4653494D4728BB
:10077000323335393239362C302C302C3132382C5A
:100780003132382C30293B0D0A00000044435631E9
:10079000362834372C36302C27C1C1B6C8A3BA3816
:1007A0003020272C31293B424C28253264293B0D2F
:1007B0000A00000044435631362834372C36302C9A
:1007C00027C1C1B6C8A3BA353020272C31293B42F6
:1007D0004C28253264293B0D0A0000004443563161
:1007E000362834372C36302C27C1C1B6C8A3BA32CC
:1007F0003020272C31293B424C28253264293B0DDF
:100800000A0000000DA1684601F032FB684600F0C6
:100810008CFB00F0CBF97D20C00000F0F0FB19202C
:10082000800100F0ECFB0FA000F07FFB00F0BEF9B0
:100830001920800100F0E3FBA8E400004443563196
:10084000362834372C36302C27C1C1B6C8A3BA316C
:100850003030272C31293B424C28253264293B0D6E
:100860000A0000004449522831293B434C522836A3
:1008700031293B4443323428352C35302C27D1DD07
:10088000CABEBDE1CAF8A3A1272C3135293B0D0A08
:1008900000000000704700BFFEE7704770477047D8
:1008A0000CB50020019000907348006801210904F4
:1008B00008437149086000BF6F480068012149047E
:1008C000084000900198401C01900098002804D135
:1008D0000521090201988842EED16748006801218C
:1008E00049040840002802D00120009001E00020C7
:1008F00000900098012839D11120604908605E48B5
:1009000040685D494860084640684860084640685D
:100910003F2109048843584948600846406811212E
:100920000904084354494860084600680121090643
:1009300008435149086000BF4F480068012149063B
:1009400008400028F8D04C484068800880004A4998
:10095000486008464068022108434749486000BF94
:10096000454840680C2108400828F9D10CBD10B555
:1009700041480068012108433F4908600846406833
:100980003F4908403C494860084600683D490840E6
:1009900039490860084600680121890488433649BE
:1009A0000860084640683F2109048843324948608E
:1009B0000846C06A00090001C8620846006BFF21B2
:1009C000543188432C4908630846406B4008400076
:1009D000486300208860FFF763FF10BDF8B500256D
:1009E000002400260027244840680C2108400546C2
:1009F000002D04D0042D06D0082D2AD107E022486E
:100A00002249086029E020482049086025E01A486A
:100A100040680F21890408400446174840680121B6
:100A2000090408400646A00C841C002E04D1184876
:100A30006043164908600BE00F48C06A0007000FCA
:100A4000471C3946104801F00CFB60430F49086011
:100A500003E00D480D49086000BF00BF064840682C
:100A6000F021084000090B490D5C08480068E84087
:100A700006490860F8BD0000001002400020024056
:100A80000CB8FFF8FFFFF6FE00127A00000000200D
:100A900000093D0004000020074880470748004740
:100AA000FEE7FEE7FEE7FEE7FEE7FEE7044805494E
:100AB000054A064B704700006F090008C100000896
:100AC000B0000020B0060020B0020020B0020020DC
:100AD00000BF704700BFFD4AD26980231A40002A38
:100AE000F9D0FA4B20331881704710B58AB004460C
:100AF0000121480400F027FE0121880300F031FEA7
:100B000001220921C80600F074FB01220A210920F4
:100B1000C00600F06EFB032040020890022108A8E6
:100B2000017103214171002181710121C17108A965
:100B30000920C00600F0D4FA02940020039004902B
:100B4000059007900C20069002A9E04800F0F0FE06
:100B50000122DF49DD4801F019F90121DB4800F0ED
:100B600080FF1B21684601710221417101218171C1
:100B700001A800F067FE04200890032108A8417135
:100B80000021817108A90920C00600F0A9FA0AB065
:100B900010BD00BFCD48C069202108400028F9D011
:100BA000CA4820300089C005C00D704704E0C9481C
:100BB00000780F2800D100E0F9E700BF0020C54908
:100BC0000870704700BFC44909785629FBD1C24953
:100BD00049784129F7D1C04989785229F3D10021B8
:100BE000BD4A1170517091701146C978017011465B
:100BF0000979417011464979817011468979C1702E
:100C00000021B64A1170B64A117000BF00BF70478C
:100C10007B2809D10021B34A11700121B24A117019
:100C20000021B24A11704FE07D2806D10021AE4A62
:100C300011700121AE4A117046E03A2801D02C28EB
:100C400008D1AA490978491CA84A11700021A54A6F
:100C5000117039E0A4490978012912D1A149097814
:100C6000032908DAA14909784A008918A14A891894
:100C70009C4A127888549B490978491C994A1170FA
:100C800022E04F2803D10121924A11701CE04B2829
:100C900007D1904909780D221140891C8D4A1170A5
:100CA00012E00D2807D18B4909780B221140091D4C
:100CB000884A117008E00A2806D186490978490750
:100CC000490F0831834A1170704710B52AE18848EE
:100CD00000780128FAD1874800785628F6D185484F
:100CE00040784128F2D1834880785228EED181485B
:100CF0004079302815DB7F484079392811DC7D4860
:100D0000C0783038642343437A48007930380A2465
:100D100060431B187748407930381818764B1870A4
:100D200020E07448007930280FDB724800793928B8
:100D30000BDC7048C07830380A2358436D4B1B7960
:100D4000303BC0186C4B18700CE06A48C0783028F3
:100D500008DB6848C078392804DC6648C078303839
:100D6000654B18706348007A302815DB6148007ABB
:100D7000392811DC5F4880793038642343435D486B
:100D8000C07930380A2460431B185A48007A30383A
:100D90001818594B587020E05648C07930280FDB9E
:100DA0005448C07939280BDC5248807930380A23FE
:100DB0005843504BDB79303BC0184F4B58700CE018
:100DC0004C488079302808DB4A488079392804DC8F
:100DD000484880793038484B58704648C07A3028A7
:100DE00015DB4448C07A392811DC4248407A303853
:100DF000642343433F48807A30380A2460431B18F9
:100E00003C48C07A303818183B4B987020E039487D
:100E1000807A30280FDB3748807A39280BDC354858
:100E2000407A30380A235843324B9B7A303BC01803
:100E3000314B98700CE02F48407A302808DB2D4861
:100E4000407A392804DC2B48407A30382A4B987095
:100E50002848807B302815DB2648807B392811DC28
:100E60002448007B3038642343432248407B303899
:100E70000A2460431B181F48807B303818181E4B0B
:100E8000D87020E01B48407B30280FDB1948407B9E
:100E900039280BDC1748007B30380A235843154BA0
:100EA0005B7B303BC018144BD8700CE01148007BC2
:100EB000302808DB0F48007B392804DC0D48007B14
:100EC00030380D4BD870002126E00000003801407A
:100ED000050105001C000020210000202500002045
:100EE00026000020180000201A0000201900002011
:100EF0001B0000203C0000201D000020002207E015
:100F000000204B00CB181C4C1B199854501CC2B22B
:100F1000032AF5DB481CC1B20529EFDB0020174B83
:100F2000187000E0D3E600BF10BD70B50446002580
:100F300010E0207800280CD02178114800F048FEFD
:100F400000BF80210E4800F055FF0028F9D0641C36
:100F500000E070BDEDE710B501240A49084800F033
:100F600055FF002806D0064800F036FEC4B22046E1
:100F7000FFF74EFE10BD00003C0000201B000020CB
:100F8000003801400501050010B50420C04300F001
:100F90009CFC2D492D48006801F063F840B22C49B3
:100FA0000870002008567D21C900484300B2294935
:100FB000088010BD0146264A0023D3560A465A43EC
:100FC000254B5A6100229A611A46126901231A437D
:100FD000214B1A6100BF204A1069C207D20F002AB4
:100FE00004D0012212040240002AF4D01A4A1269E5
:100FF00052085200184B1A6100229A61704701464C
:10100000144A0023D35E0A465A43134B5A61002206
:101010009A611A46126901231A430F4B1A6100BFE5
:101020000D4A1069C207D20F002A04D0012212040F
:101030000240002AF4D0084A126952085200064BB6
:101040001A6100229A61704700127A0000000020A5
:10105000280000202A00002000E000E010B504462F
:101060000920C006844209D10121480400F095FB03
:1010700000210120400400F090FB30E06E488442E3
:1010800008D10121000200F088FB0021200200F0BD
:1010900084FB24E06948844208D10121000200F069
:1010A0007CFB0021200200F078FB18E064488442B9
:1010B00009D10121080500F070FB00210120000585
:1010C00000F06BFB0BE05F48844208D101218805EA
:1010D00000F063FB00210120800500F05EFB10BDE5
:1010E000F0B50A4600210023002400BF3DE00125A1
:1010F0008D402B4615681D402C469C4234D11579F5
:10110000012D02D01579022D16D185684F000326D6
:10111000BE40B543856055794E00B540866835437D
:101120008560858801268E40B543858085889679BF
:101130008E40B6B23543858005684F000326BE4019
:10114000B543056015794E00B54006683543056026
:10115000C5684F000326BE40B543C560D5794E0033
:10116000B540C6683543C560491C1029BFD3F0BDE2
:101170003549016000210171022141710021817115
:10118000C171704708B5012212040092009A0A4307
:101190000092009AC261C161009AC261C269009264
:1011A000C269009208BD02460020138A0B40002B42
:1011B00001D0012000E0002070470146088A7047F6
:1011C00002460020938A0B40002B01D0012000E052
:1011D000002070470146888A704781617047018509
:1011E0007047002A01D0816100E00185704781824B
:1011F0007047F0B5002300244D07EE0E1546B540AC
:101200002B46CD10AE0005462035AD594E07F70EE2
:101210000F26BE40B543CE10B60007462037BD515D
:10122000CD10AE003D46AD591D432C46CD10AD004E
:101230003E467451F0BD000000040048000800481C
:10124000000C004800140048FFFF0000FD48006843
:1012500001210843FB49086008464068FA490840F4
:10126000F849486008460068F8490840F5490860B0
:1012700008460068012189048843F249086008464D
:1012800040683F2109048843EE4948600846C06A27
:1012900000090001C8620846006BFF2154318843F1
:1012A000E84908630846406B400840004863002056
:1012B000886070470021E34A91701146887070473A
:1012C00010B502460021002300205111002902D14F
:1012D000DC4C23680BE0012902D1DA4C236A06E0DA
:1012E000022902D1D74C636A01E0D64C636BD10668
:1012F000C90E01248C401C40002C01D0012000E0CC
:10130000002010BD38B5002000900024002500BF4B
:101310001120FFF7D5FF05460098401C00900521DD
:1013200009020098884201D0002DF1D01120FFF76A
:10133000C7FF002801D0012400E00024204638BD6A
:1013400001460020BF4A1068F82302469A4310461F
:10135000CA001043BB4A10607047002806D0B94944
:10136000096801221143B74A116005E0B5490968CF
:1013700049084900B34A1160704701460020B14A4C
:10138000506BF82302469A431046CA001043AD4AF8
:1013900050637047002806D0AA49496B01221143C7
:1013A000A84A516305E0A749496B49084900A54A85
:1013B00051637047002806D0A249496B042291432B
:1013C000A04A516305E09F49496B042211439D4A9D
:1013D000516370479B49096A49084900994A11625B
:1013E0001146096A04229143964A11621146096A1C
:1013F0000143116270479349096A18229143914A47
:1014000011621146096A014311627047002806D033
:101410008C49496A012211438A4A516205E089498F
:10142000496A49084900874A51627047854A5268AB
:101430003D231B049A43834B5A601A465268034665
:101440000B431A437F4B5A607047002807D07D49F1
:1014500009680122120611437A4A116006E07949AF
:101460000968012212069143764A116070470146CD
:101470000020744AD06A0009000102460A4310465F
:10148000704AD0627047002807D06E49096801226F
:10149000D20411436B4A116006E06A4909680122CF
:1014A000D2049143674A116070476649C87170471A
:1014B00001460020634A50688008800002460A43C3
:1014C0001046604A506070475E4840680C210840F2
:1014D0007047014600205B4A5068F02302469A4359
:1014E000104602460A431046564A5060704701466D
:1014F0000020544A506807231B0202469A431046B4
:1015000002460A4310464F4A506070474D494968A9
:101510000122920391434B4A51601146496882B2BD
:101520001143484A51601146096B92159143454A4F
:1015300011631146096B020C1143424A1163704753
:101540004049096B402291433E4A11631146096BA1
:101550000143116370473B49096B10229143394A9B
:1015600011631146096B0143116370473549096BDB
:1015700089088900334A11631146096B01431163DD
:101580007047FEB50446002500260020019000901B
:1015900000272C4840680C2108400546002D04D047
:1015A000042D05D0082D28D105E02948206027E02A
:1015B0002748206024E0234840680F218904084020
:1015C0000646204840680121090408400190B00CFB
:1015D000861C0198002803D11E48704320600BE050
:1015E0001848C06A0007000F401C00901848009976
:1015F00000F037FD7043206002E01548206000BF16
:1016000000BF10484068F021084005462D091248E7
:10161000475D2068F84060600A4840680721090279
:10162000084005462D0A0C48475D6068F840A060F8
:101630000448006BFF2101310840884210D0074860
:10164000E0601BE0001002400CB8FFF8FFFFF6FE60
:1016500000127A0000093D002C000020809FD50078
:1016600075484068012189030840884203D0A0687A
:101670004008E06002E0A0688008E0606E48006B0F
:1016800040210840402802D06C48206102E001203F
:10169000C00320616848006B10210840102802D068
:1016A0006748606101E0206860616348006B800703
:1016B000800F002802D1A068A06119E05E48006B8D
:1016C0008007800F012802D12068A06110E05A48ED
:1016D000006B8007800F022802D18003A06107E021
:1016E0005548006B8007800F032801D15448A06142
:1016F000FEBD5149096A01434F4A116270470028F3
:1017000007D04D49096A0122D20311434A4A1162A6
:1017100006E04949096A0122D2039143464A11620F
:101720007047002807D04449096A01221204114376
:10173000414A116206E04049096A012212049143BC
:101740003D4A11627047002905D03B4A5269024365
:10175000394B5A6104E0384A52698243364B5A6128
:101760007047002905D0344A92690243324B9A618E
:1017700004E0314A926982432F4B9A6170470029F5
:1017800005D02D4AD26902432B4BDA6104E02A4A84
:10179000D2698243284BDA617047002905D0264A76
:1017A000926A0243244B9A6204E0234A926A82437B
:1017B000214B9A627047002905D01F4AD268024324
:1017C0001D4BDA6004E01C4AD26882431A4BDA608F
:1017D0007047002905D0184A12690243164B1A6156
:1017E00004E0154A12698243134B1A6170470029BD
:1017F00005D0114A527A02430F4B5A7204E00E4A46
:10180000527A82430C4B5A7270470B48406A01214E
:101810000906084308494862704701460020064A05
:1018200092680A40002A01D0012000E000207047A1
:1018300001498872704700000010024012800000C9
:1018400000127A0000218278002A27D0274A032339
:101850001B02D21803789B109B00D1580278920784
:10186000D30EFF229A400B469343194642789207C3
:10187000120E03789B07DB0E9A4011431B4A032389
:101880001B02D21803789B109B00D1500278D3061C
:10189000DB0E01229A40154B1A6007E00278D3064E
:1018A000DB0E01229A40114B80331A6070470029E9
:1018B00005D00F4A126902430D4B1A6104E00C4A2D
:1018C000126982430A4B1A617047042806D10949FC
:1018D000096904221143074A116105E005490969B4
:1018E00004229143034A11617047000000E100E0C7
:1018F00000ED00E000E000E010B50446F748844247
:1019000009D101218803FFF756FF00210120800340
:10191000FFF751FF0BE0F248844208D1012148044F
:10192000FFF757FF002101204004FFF752FF10BDD1
:10193000F0B589B005460E4600240020089000BF8F
:1019400000BF28684008400028606C680321090334
:10195000204688430446B06804436C602C68E14824
:101960000440F168706808433169084304432C60FF
:10197000AC68032109022046884304467069044389
:10198000AC606846FFF7FDFDD448854202D1069859
:10199000089001E00298089028680121C9030840D6
:1019A000002809D0326851001923089A5A4310467A
:1019B00000F057FB074608E0326891001923089AA7
:1019C0005A43104600F04DFB07466421384600F0AC
:1019D00048FB0401200964214843381A079028680D
:1019E0000121C903084000280AD00799C900084608
:1019F0003230642100F035FB4007400F044309E01A
:101A00000799090108463230642100F02AFB0007DB
:101A1000000F0443AC8109B0F0BD4B21C901016046
:101A2000002141608160C1600C21016100214161A0
:101A3000704710B5002242680F2424021346A343C6
:101A40001A464C680B6823438C682343CC682343B5
:101A50001A43426010BD0021016041608160C16095
:101A60007047002904D0026801231A43026003E092
:101A700002685208520002607047002A03D00368CF
:101A80000B43036002E003688B4303607047002947
:101A900005D002680123DB031A43026004E00268F8
:101AA0000123DB039A4302607047002905D0826856
:101AB0000123DB021A43826004E082680123DB0217
:101AC0009A4382607047002905D042680123DB04F5
:101AD0001A43426004E042680123DB049A434260F7
:101AE0007047002905D0426801239B041A434260D5
:101AF00004E0426801239B049A4342607047002A35
:101B000003D043680B43436002E043688B43436068
:101B10007047002905D042680123DB031A43426065
:101B200004E042680123DB039A43426070470029C6
:101B300005D042680123DB051A43426004E0426895
:101B40000123DB059A43426070474269120E120678
:101B5000426142690A4342617047028AFF231B02C5
:101B60001A400282028A0A4302827047002904D086
:101B7000026802231A43026003E0026802239A43C8
:101B800002607047826803231B059A438260826863
:101B90000A4382607047002905D0426801231B0573
:101BA0001A43426004E0426801231B059A434260E5
:101BB0007047426803235B059A43426042680A43C8
:101BC00042607047C1690122D2039143C1617047ED
:101BD000CA05D20D028570470146888CC005C00D2C
:101BE000704742681202120A426042680B061A43AA
:101BF00042607047002905D0026801235B031A4345
:101C0000026004E0026801235B039A4302607047AC
:101C100002680123DB029A43026002680A43026001
:101C20007047426810239A43426042680A43426008
:101C30007047426820239A43426042680A434260E8
:101C40007047002905D0426801239B031A43426074
:101C500004E0426801239B039A43426070470029D5
:101C600004D0826808231A43826003E08268082354
:101C70009A4382607047028AD2B20282028A0B02C1
:101C80001A4302827047002904D0826820231A4335
:101C9000826003E0826820239A43826070470029B3
:101CA00004D0826810231A43826003E08268102304
:101CB0009A4382607047826807235B049A4382607C
:101CC00082684B041A438260704742691202120A0A
:101CD000426142690B061A43426170470038014075
:101CE00000440040F3E9FFFF826804239A438260C6
:101CF00082680A4382607047002904D08268022308
:101D00001A43826003E0826802239A43826070472C
:101D1000002905D0826801239B031A43826004E0F6
:101D2000826801239B039A43826070478268012383
:101D3000DB039A43826082680A43826070470268CC
:101D40001F235B059A43026002684B051A43026039
:101D5000704702681F231B049A43026002680B0449
:101D60001A4302607047002A03D083680B438360E4
:101D700002E083688B4383607047826801235B03C2
:101D80009A43826082680A4382607047F8B50346CE
:101D90000024002600960025002018460E04340E6C
:101DA000CEB200960127009EB7403D46022C01D1DD
:101DB000001D02E0032C00D10830002A03D0066881
:101DC0002E43066002E00668AE430660F8BD002AB6
:101DD00003D0038B0B43038302E0038B8B4303830A
:101DE0007047826801231B039A43826082680A431A
:101DF0008260704702460020D3690B40002B01D05F
:101E0000012000E0002070470162704770B5024673
:101E10000B4600240021002500201E04350ED9B2F7
:101E200001268E403146012D02D11668314006E070
:101E3000022D02D15668314001E0966831401C0CF9
:101E40000126A6403446D6693440002903D0002C30
:101E500001D0012000E0002070BD10B50023002259
:101E60000B0C01249C402246026210BD704700000A
:101E70000FB41CB5074B06AA7B4469460090059831
:101E800000F0FDF90020694600F00CFA1CBC08BC0B
:101E900004B018472904000070B50446856900683D
:101EA000C10601D5302600E02026C00707D070BD4E
:101EB00062683046A1689047206A401C20626D1E0F
:101EC000F6D570BD70B5044685690078C00707D1A6
:101ED00070BD6268A16820209047206A401C206283
:101EE0006D1EF6D570BD0000F7B500257529106888
:101EF000009914A611D0C046C046002802DA40421C
:101F000011A608E0009909688A0701D50FA602E02A
:101F1000490704D50EA6012501E0C046C046009F32
:101F20000024243704E000F0C2F930313955641C34
:101F30000028F8D12B4632462146009800F042F99D
:101F4000FEBD0000000000002D0000002B0000007E
:101F500020000000F3B50446002081B02062204636
:101F6000E168884700287AD0252802D06268A168F5
:101F700071E0E16820460025884706460020E061C0
:101F80000746A0612A2E0AD0304600F0CFF900287B
:101F900027D0B8000019303E0090866119E0029801
:101FA000BA00121902C8916102902046E168884780
:101FB000012F064617D1E06900281FDA202085434B
:101FC0001CE000980A218069484300998019303844
:101FD00088612046E1688847064600F0A7F9002896
:101FE000EFD1012F0AD02E2E08D12046E168884774
:101FF0000646202005437F1C022FC3DBA069002872
:1020000003DA4042A06101200543E80701D0102017
:102010008543002E23D030464138192803D80120AB
:10202000C00205432036204625603146029A1546F7
:10203000FEF784F800280BD0012806D0ED1DE80833
:10204000C000083002908AE709E02D1D029586E75E
:1020500062683046A1689047206A401C7EE7206A8B
:10206000FEBD002203098B422CD3030A8B4211D3FD
:1020700000239C464EE003460B433CD40022430819
:102080008B4231D303098B421CD3030A8B4201D309
:1020900094463FE0C3098B4201D3CB01C01A5241A1
:1020A00083098B4201D38B01C01A524143098B42F1
:1020B00001D34B01C01A524103098B4201D30B01DA
:1020C000C01A5241C3088B4201D3CB00C01A5241FF
:1020D00083088B4201D38B00C01A524143088B42C4
:1020E00001D34B00C01A5241411A00D2014652415D
:1020F000104670475DE0CA0F00D04942031000D37C
:102100004042534000229C4603098B422DD3030AD0
:102110008B4212D3FC22890112BA030A8B420CD3E0
:10212000890192118B4208D3890192118B4204D309
:1021300089013AD0921100E08909C3098B4201D389
:10214000CB01C01A524183098B4201D38B01C01AC3
:10215000524143098B4201D34B01C01A524103093A
:102160008B4201D30B01C01A5241C3088B4201D3E9
:10217000CB00C01A524183088B4201D38B00C01A96
:102180005241D9D243088B4201D34B00C01A52416D
:10219000411A00D20146634652415B10104601D3FA
:1021A0004042002B00D54942704763465B1000D384
:1021B000404201B50020C046C04602BD704770478E
:1021C00070477047FFB504460D4681B0243000903B
:1021D0002168880604D51022E0699143216000E05F
:1021E0000120A84201DD471B00E000270498A169F7
:1021F0007A191018081AA0612078C00602D4204667
:10220000FFF74AFE002608E003986268A168805D37
:102210009047206A401C761C206204988642F3DBBB
:102220002078C0060AD52046FFF736FE06E0626831
:10223000A16830209047206A401C206238467F1EEB
:102240000028F4DC07E000986268A168405D9047D0
:10225000206A401C206228466D1E0028F3DC2046C0
:10226000FFF730FE2078000602D5022005B0F0BD51
:102270000120FBE701694A1C02610878704700B53C
:102280008FB0029100210591054901937944039192
:10229000114604906846FFF75DFE0FB000BD0000D8
:1022A000E5FFFFFF0A681070521C0A607047014684
:1022B0008008081A02091018020A1018020C1018D7
:1022C000C008820012185200891A01E0401C0A3925
:1022D0000A29FBD27047754600F024F8AE46050087
:1022E00069465346C008C000854618B020B5FEF7C1
:1022F000DDFB60BC00274908B6460026C0C5C0C546
:10230000C0C5C0C5C0C5C0C5C0C5C0C5403D4900E9
:102310008D46704710B50446C046C0462046FDF7BE
:1023200022FF10BD004870474C00002030380A28BA
:1023300001D2012070470020704700005C23000894
:10234000000000203C000000040100089823000861
:102350003C0000207406000020010008006CDC0234
:102360000000000000000000010203040607080945
:10237000000000000000000000000000000000005D
:102380000000000000000000000000000102030443
:0823900001020304060708091D
:0400000508000A994C
:00000001FF

View File

@@ -0,0 +1,845 @@
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html><head>
<title>Static Call Graph - [..\OBJ\TEST.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image ..\OBJ\TEST.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Mon Oct 19 21:37:39 2020
<BR><P>
<H3>Maximum Stack Usage = 264 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
__rt_entry_main &rArr; main &rArr; USART1_Init &rArr; USART_Init &rArr; RCC_GetClocksFreq
<P>
<H3>
Functions with no stack information
</H3><UL>
<LI><a href="#[2e]">__user_initial_stackheap</a>
</UL>
</UL>
<P>
<H3>
Mutually Recursive functions
</H3> <LI><a href="#[17]">ADC1_COMP_IRQHandler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[17]">ADC1_COMP_IRQHandler</a><BR>
</UL>
<P>
<H3>
Function Pointers
</H3><UL>
<LI><a href="#[17]">ADC1_COMP_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[27]">CEC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[14]">DMA1_Channel1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[15]">DMA1_Channel2_3_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[16]">DMA1_Channel4_5_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[10]">EXTI0_1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[11]">EXTI2_3_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[12]">EXTI4_15_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[e]">FLASH_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[7]">HardFault_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[21]">I2C1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[22]">I2C2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[6]">NMI_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[c]">PVD_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[9]">PendSV_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[f]">RCC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[d]">RTC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[2c]">Reset_Handler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[23]">SPI1_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[24]">SPI2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[8]">SVC_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[a]">SysTick_Handler</a> from stm32f0xx_it.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[28]">SystemInit</a> from system_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(.text)
<LI><a href="#[1d]">TIM14_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1e]">TIM15_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1f]">TIM16_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[20]">TIM17_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[18]">TIM1_BRK_UP_TRG_COM_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[19]">TIM1_CC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1a]">TIM2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1b]">TIM3_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[1c]">TIM6_DAC_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[13]">TS_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[25]">USART1_IRQHandler</a> from usart1.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[26]">USART2_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[b]">WWDG_IRQHandler</a> from startup_stm32f0xx.o(.text) referenced from startup_stm32f0xx.o(RESET)
<LI><a href="#[2d]">__main</a> from __main.o(!!!main) referenced from startup_stm32f0xx.o(.text)
<LI><a href="#[2b]">_printf_input_char</a> from _printf_char_common.o(.text) referenced from _printf_char_common.o(.text)
<LI><a href="#[2a]">_sputc</a> from _sputc.o(.text) referenced from noretval__2sprintf.o(.text)
</UL>
<P>
<H3>
Global Symbols
</H3>
<P><STRONG><a name="[2d]"></a>__main</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, __main.o(!!!main))
<BR><BR>[Calls]<UL><LI><a href="#[30]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry
<LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
</UL>
<P><STRONG><a name="[2f]"></a>__scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter))
<BR><BR>[Called By]<UL><LI><a href="#[2d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main
</UL>
<P><STRONG><a name="[31]"></a>__scatterload_rt2</STRONG> (Thumb, 52 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[30]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry
</UL>
<P><STRONG><a name="[6d]"></a>__scatterload_rt2_thumb_only</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED)
<P><STRONG><a name="[6e]"></a>__scatterload_null</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED)
<P><STRONG><a name="[32]"></a>__scatterload_copy</STRONG> (Thumb, 26 bytes, Stack size unknown bytes, __scatter_copy.o(!!handler_copy), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[32]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload_copy
</UL>
<BR>[Called By]<UL><LI><a href="#[32]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload_copy
</UL>
<P><STRONG><a name="[6f]"></a>__scatterload_zeroinit</STRONG> (Thumb, 28 bytes, Stack size unknown bytes, __scatter_zi.o(!!handler_zi), UNUSED)
<P><STRONG><a name="[67]"></a>_printf_percent</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, _printf_percent.o(.ARM.Collect$$_printf_percent$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__printf
</UL>
<P><STRONG><a name="[33]"></a>_printf_d</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, _printf_d.o(.ARM.Collect$$_printf_percent$$00000009))
<BR><BR>[Stack]<UL><LI>Max Depth = 88 + Unknown Stack Size
<LI>Call Chain = _printf_d &rArr; _printf_int_dec &rArr; _printf_int_common &rArr; _printf_post_padding
</UL>
<BR>[Calls]<UL><LI><a href="#[34]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_percent_end
<LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_dec
</UL>
<P><STRONG><a name="[34]"></a>_printf_percent_end</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, _printf_percent_end.o(.ARM.Collect$$_printf_percent$$00000017))
<BR><BR>[Called By]<UL><LI><a href="#[33]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_d
</UL>
<P><STRONG><a name="[39]"></a>__rt_lib_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit.o(.ARM.Collect$$libinit$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_li
</UL>
<P><STRONG><a name="[70]"></a>__rt_lib_init_alloca_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002E))
<P><STRONG><a name="[71]"></a>__rt_lib_init_argv_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002C))
<P><STRONG><a name="[72]"></a>__rt_lib_init_atexit_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001B))
<P><STRONG><a name="[73]"></a>__rt_lib_init_clock_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000021))
<P><STRONG><a name="[74]"></a>__rt_lib_init_cpp_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000032))
<P><STRONG><a name="[75]"></a>__rt_lib_init_exceptions_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000030))
<P><STRONG><a name="[76]"></a>__rt_lib_init_fp_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000002))
<P><STRONG><a name="[77]"></a>__rt_lib_init_fp_trap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001F))
<P><STRONG><a name="[78]"></a>__rt_lib_init_getenv_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000023))
<P><STRONG><a name="[79]"></a>__rt_lib_init_heap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000A))
<P><STRONG><a name="[7a]"></a>__rt_lib_init_lc_collate_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000011))
<P><STRONG><a name="[7b]"></a>__rt_lib_init_lc_ctype_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000013))
<P><STRONG><a name="[7c]"></a>__rt_lib_init_lc_monetary_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000015))
<P><STRONG><a name="[7d]"></a>__rt_lib_init_lc_numeric_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000017))
<P><STRONG><a name="[7e]"></a>__rt_lib_init_lc_time_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000019))
<P><STRONG><a name="[7f]"></a>__rt_lib_init_preinit_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000004))
<P><STRONG><a name="[80]"></a>__rt_lib_init_rand_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000E))
<P><STRONG><a name="[81]"></a>__rt_lib_init_return</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000033))
<P><STRONG><a name="[82]"></a>__rt_lib_init_signal_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001D))
<P><STRONG><a name="[83]"></a>__rt_lib_init_stdio_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000025))
<P><STRONG><a name="[84]"></a>__rt_lib_init_user_alloc_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000C))
<P><STRONG><a name="[3e]"></a>__rt_lib_shutdown</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown.o(.ARM.Collect$$libshutdown$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_exit_ls
</UL>
<P><STRONG><a name="[85]"></a>__rt_lib_shutdown_cpp_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000002))
<P><STRONG><a name="[86]"></a>__rt_lib_shutdown_fp_trap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000007))
<P><STRONG><a name="[87]"></a>__rt_lib_shutdown_heap_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F))
<P><STRONG><a name="[88]"></a>__rt_lib_shutdown_return</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000010))
<P><STRONG><a name="[89]"></a>__rt_lib_shutdown_signal_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000A))
<P><STRONG><a name="[8a]"></a>__rt_lib_shutdown_stdio_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000004))
<P><STRONG><a name="[8b]"></a>__rt_lib_shutdown_user_alloc_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000C))
<P><STRONG><a name="[30]"></a>__rt_entry</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry.o(.ARM.Collect$$rtentry$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[2d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main
<LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload_rt2
</UL>
<P><STRONG><a name="[8c]"></a>__rt_entry_presh_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$00000002))
<P><STRONG><a name="[36]"></a>__rt_entry_sh</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry4.o(.ARM.Collect$$rtentry$$00000004))
<BR><BR>[Stack]<UL><LI>Max Depth = 8 + Unknown Stack Size
<LI>Call Chain = __rt_entry_sh &rArr; __user_setup_stackheap
</UL>
<BR>[Calls]<UL><LI><a href="#[37]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_setup_stackheap
</UL>
<P><STRONG><a name="[38]"></a>__rt_entry_li</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$0000000A))
<BR><BR>[Calls]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_lib_init
</UL>
<P><STRONG><a name="[8d]"></a>__rt_entry_postsh_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$00000009))
<P><STRONG><a name="[3a]"></a>__rt_entry_main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$0000000D))
<BR><BR>[Stack]<UL><LI>Max Depth = 264 + Unknown Stack Size
<LI>Call Chain = __rt_entry_main &rArr; main &rArr; USART1_Init &rArr; USART_Init &rArr; RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;exit
<LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[8e]"></a>__rt_entry_postli_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$0000000C))
<P><STRONG><a name="[6c]"></a>__rt_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit.o(.ARM.Collect$$rtexit$$00000000))
<BR><BR>[Called By]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;exit
</UL>
<P><STRONG><a name="[3d]"></a>__rt_exit_ls</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000003))
<BR><BR>[Calls]<UL><LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_lib_shutdown
</UL>
<P><STRONG><a name="[8f]"></a>__rt_exit_prels_1</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000002))
<P><STRONG><a name="[3f]"></a>__rt_exit_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000004))
<BR><BR>[Calls]<UL><LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_sys_exit
</UL>
<P><STRONG><a name="[3b]"></a>main</STRONG> (Thumb, 1734 bytes, Stack size 128 bytes, main.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 264 + Unknown Stack Size
<LI>Call Chain = main &rArr; USART1_Init &rArr; USART_Init &rArr; RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_ms
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_init
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UartSend
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;CheckBusy
</UL>
<BR>[Called By]<UL><LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_main
</UL>
<P><STRONG><a name="[6]"></a>NMI_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[7]"></a>HardFault_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[8]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[9]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[a]"></a>SysTick_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f0xx_it.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[28]"></a>SystemInit</STRONG> (Thumb, 110 bytes, Stack size 8 bytes, system_stm32f0xx.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = SystemInit &rArr; SetSysClock
</UL>
<BR>[Calls]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SetSysClock
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(.text)
</UL>
<P><STRONG><a name="[48]"></a>SystemCoreClockUpdate</STRONG> (Thumb, 154 bytes, Stack size 24 bytes, system_stm32f0xx.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<P><STRONG><a name="[2c]"></a>Reset_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<P><STRONG><a name="[17]"></a>ADC1_COMP_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR><BR>[Calls]<UL><LI><a href="#[17]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC1_COMP_IRQHandler
</UL>
<BR>[Called By]<UL><LI><a href="#[17]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC1_COMP_IRQHandler
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[27]"></a>CEC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[14]"></a>DMA1_Channel1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[15]"></a>DMA1_Channel2_3_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[16]"></a>DMA1_Channel4_5_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[10]"></a>EXTI0_1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[11]"></a>EXTI2_3_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[12]"></a>EXTI4_15_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[e]"></a>FLASH_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[21]"></a>I2C1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[22]"></a>I2C2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[c]"></a>PVD_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[f]"></a>RCC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[d]"></a>RTC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[23]"></a>SPI1_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[24]"></a>SPI2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1d]"></a>TIM14_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1e]"></a>TIM15_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1f]"></a>TIM16_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[20]"></a>TIM17_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[18]"></a>TIM1_BRK_UP_TRG_COM_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[19]"></a>TIM1_CC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1a]"></a>TIM2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1b]"></a>TIM3_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[1c]"></a>TIM6_DAC_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[13]"></a>TS_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[26]"></a>USART2_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[b]"></a>WWDG_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f0xx.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[2e]"></a>__user_initial_stackheap</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, startup_stm32f0xx.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[37]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_setup_stackheap
</UL>
<P><STRONG><a name="[40]"></a>_sys_exit</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, usart1.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_exit_exit
</UL>
<P><STRONG><a name="[90]"></a>fputc</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, usart1.o(.text), UNUSED)
<P><STRONG><a name="[43]"></a>USART1_Init</STRONG> (Thumb, 168 bytes, Stack size 48 bytes, usart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = USART1_Init &rArr; USART_Init &rArr; RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Init
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_ITConfig
<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Cmd
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB2PeriphClockCmd
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_Init
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_PinAFConfig
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[91]"></a>UartGet</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, usart1.o(.text), UNUSED)
<P><STRONG><a name="[46]"></a>CheckBusy</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, usart1.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[92]"></a>get_var</STRONG> (Thumb, 76 bytes, Stack size 0 bytes, usart1.o(.text), UNUSED)
<P><STRONG><a name="[56]"></a>getch</STRONG> (Thumb, 186 bytes, Stack size 0 bytes, usart1.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[25]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[93]"></a>GetValue</STRONG> (Thumb, 608 bytes, Stack size 8 bytes, usart1.o(.text), UNUSED)
<P><STRONG><a name="[45]"></a>UartSend</STRONG> (Thumb, 44 bytes, Stack size 16 bytes, usart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = UartSend
</UL>
<BR>[Calls]<UL><LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_SendData
<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_GetFlagStatus
</UL>
<BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[25]"></a>USART1_IRQHandler</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, usart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = USART1_IRQHandler &rArr; USART_GetITStatus
</UL>
<BR>[Calls]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_ReceiveData
<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_GetITStatus
<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;getch
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f0xx.o(RESET)
</UL>
<P><STRONG><a name="[41]"></a>delay_init</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, delay.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = delay_init
</UL>
<BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_CLKSourceConfig
</UL>
<BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[94]"></a>delay_us</STRONG> (Thumb, 74 bytes, Stack size 0 bytes, delay.o(.text), UNUSED)
<P><STRONG><a name="[42]"></a>delay_ms</STRONG> (Thumb, 74 bytes, Stack size 0 bytes, delay.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[58]"></a>GPIO_DeInit</STRONG> (Thumb, 132 bytes, Stack size 8 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphResetCmd
</UL>
<P><STRONG><a name="[4d]"></a>GPIO_Init</STRONG> (Thumb, 144 bytes, Stack size 20 bytes, stm32f0xx_gpio.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[95]"></a>GPIO_StructInit</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[96]"></a>GPIO_PinLockConfig</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[97]"></a>GPIO_ReadInputDataBit</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[98]"></a>GPIO_ReadInputData</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[99]"></a>GPIO_ReadOutputDataBit</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[9a]"></a>GPIO_ReadOutputData</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[9b]"></a>GPIO_SetBits</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[9c]"></a>GPIO_ResetBits</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[9d]"></a>GPIO_WriteBit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[9e]"></a>GPIO_Write</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text), UNUSED)
<P><STRONG><a name="[4c]"></a>GPIO_PinAFConfig</STRONG> (Thumb, 68 bytes, Stack size 20 bytes, stm32f0xx_gpio.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = GPIO_PinAFConfig
</UL>
<BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[9f]"></a>RCC_DeInit</STRONG> (Thumb, 104 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a0]"></a>RCC_HSEConfig</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[5b]"></a>RCC_GetFlagStatus</STRONG> (Thumb, 68 bytes, Stack size 8 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_WaitForHSEStartUp
</UL>
<P><STRONG><a name="[5a]"></a>RCC_WaitForHSEStartUp</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_GetFlagStatus
</UL>
<P><STRONG><a name="[a1]"></a>RCC_AdjustHSICalibrationValue</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a2]"></a>RCC_HSICmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a3]"></a>RCC_AdjustHSI14CalibrationValue</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a4]"></a>RCC_HSI14Cmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a5]"></a>RCC_HSI14ADCRequestCmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a6]"></a>RCC_LSEConfig</STRONG> (Thumb, 34 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a7]"></a>RCC_LSEDriveConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a8]"></a>RCC_LSICmd</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[a9]"></a>RCC_PLLConfig</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[aa]"></a>RCC_PLLCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[ab]"></a>RCC_PREDIV1Config</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[ac]"></a>RCC_ClockSecuritySystemCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[ad]"></a>RCC_MCOConfig</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[ae]"></a>RCC_SYSCLKConfig</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[af]"></a>RCC_GetSYSCLKSource</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b0]"></a>RCC_HCLKConfig</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b1]"></a>RCC_PCLKConfig</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b2]"></a>RCC_ADCCLKConfig</STRONG> (Thumb, 52 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b3]"></a>RCC_CECCLKConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b4]"></a>RCC_I2CCLKConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b5]"></a>RCC_USARTCLKConfig</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[5c]"></a>RCC_GetClocksFreq</STRONG> (Thumb, 368 bytes, Stack size 32 bytes, stm32f0xx_rcc.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Init
</UL>
<P><STRONG><a name="[b6]"></a>RCC_RTCCLKConfig</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b7]"></a>RCC_RTCCLKCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[b8]"></a>RCC_BackupResetCmd</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[4a]"></a>RCC_AHBPeriphClockCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[4b]"></a>RCC_APB2PeriphClockCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[b9]"></a>RCC_APB1PeriphClockCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[59]"></a>RCC_AHBPeriphResetCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_DeInit
</UL>
<P><STRONG><a name="[5e]"></a>RCC_APB2PeriphResetCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_DeInit
</UL>
<P><STRONG><a name="[5f]"></a>RCC_APB1PeriphResetCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_DeInit
</UL>
<P><STRONG><a name="[ba]"></a>RCC_ITConfig</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[bb]"></a>RCC_ClearFlag</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[bc]"></a>RCC_GetITStatus</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[bd]"></a>RCC_ClearITPendingBit</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text), UNUSED)
<P><STRONG><a name="[51]"></a>NVIC_Init</STRONG> (Thumb, 106 bytes, Stack size 0 bytes, stm32f0xx_misc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[be]"></a>NVIC_SystemLPConfig</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_misc.o(.text), UNUSED)
<P><STRONG><a name="[57]"></a>SysTick_CLKSourceConfig</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f0xx_misc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_init
</UL>
<P><STRONG><a name="[5d]"></a>USART_DeInit</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, stm32f0xx_usart.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB1PeriphResetCmd
<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB2PeriphResetCmd
</UL>
<P><STRONG><a name="[4e]"></a>USART_Init</STRONG> (Thumb, 234 bytes, Stack size 56 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = USART_Init &rArr; RCC_GetClocksFreq
</UL>
<BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_GetClocksFreq
</UL>
<BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[bf]"></a>USART_StructInit</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c0]"></a>USART_ClockInit</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c1]"></a>USART_ClockStructInit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[50]"></a>USART_Cmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[c2]"></a>USART_DirectionModeCmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c3]"></a>USART_OverSampling8Cmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c4]"></a>USART_OneBitMethodCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c5]"></a>USART_MSBFirstCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c6]"></a>USART_DataInvCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c7]"></a>USART_InvPinCmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c8]"></a>USART_SWAPPinCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[c9]"></a>USART_ReceiverTimeOutCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[ca]"></a>USART_SetReceiverTimeOut</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cb]"></a>USART_SetPrescaler</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cc]"></a>USART_STOPModeCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cd]"></a>USART_StopModeWakeUpSourceConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[ce]"></a>USART_AutoBaudRateCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[cf]"></a>USART_AutoBaudRateConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d0]"></a>USART_AutoBaudRateNewRequest</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[52]"></a>USART_SendData</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UartSend
</UL>
<P><STRONG><a name="[55]"></a>USART_ReceiveData</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[25]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[d1]"></a>USART_SetAddress</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d2]"></a>USART_MuteModeCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d3]"></a>USART_MuteModeWakeUpConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d4]"></a>USART_AddressDetectionConfig</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d5]"></a>USART_LINBreakDetectLengthConfig</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d6]"></a>USART_LINCmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d7]"></a>USART_HalfDuplexCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d8]"></a>USART_SetGuardTime</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[d9]"></a>USART_SmartCardCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[da]"></a>USART_SmartCardNACKCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[db]"></a>USART_SetAutoRetryCount</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[dc]"></a>USART_SetBlockLength</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[dd]"></a>USART_IrDAConfig</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[de]"></a>USART_IrDACmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[df]"></a>USART_DECmd</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e0]"></a>USART_DEPolarityConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e1]"></a>USART_SetDEAssertionTime</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e2]"></a>USART_SetDEDeassertionTime</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e3]"></a>USART_DMACmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e4]"></a>USART_DMAReceptionErrorConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[4f]"></a>USART_ITConfig</STRONG> (Thumb, 66 bytes, Stack size 24 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = USART_ITConfig
</UL>
<BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_Init
</UL>
<P><STRONG><a name="[e5]"></a>USART_RequestCmd</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e6]"></a>USART_OverrunDetectionConfig</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[53]"></a>USART_GetFlagStatus</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UartSend
</UL>
<P><STRONG><a name="[e7]"></a>USART_ClearFlag</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[54]"></a>USART_GetITStatus</STRONG> (Thumb, 78 bytes, Stack size 16 bytes, stm32f0xx_usart.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = USART_GetITStatus
</UL>
<BR>[Called By]<UL><LI><a href="#[25]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART1_IRQHandler
</UL>
<P><STRONG><a name="[e8]"></a>USART_ClearITPendingBit</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, stm32f0xx_usart.o(.text), UNUSED)
<P><STRONG><a name="[e9]"></a>__use_no_semihosting</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, use_no_semi_2.o(.text), UNUSED)
<P><STRONG><a name="[44]"></a>__2sprintf</STRONG> (Thumb, 36 bytes, Stack size 32 bytes, noretval__2sprintf.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 128 + Unknown Stack Size
<LI>Call Chain = __2sprintf &rArr; _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[2a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_sputc
<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_common
</UL>
<BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[68]"></a>_printf_pre_padding</STRONG> (Thumb, 44 bytes, Stack size 16 bytes, _printf_pad.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = _printf_pre_padding
</UL>
<BR>[Called By]<UL><LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_common
</UL>
<P><STRONG><a name="[69]"></a>_printf_post_padding</STRONG> (Thumb, 34 bytes, Stack size 16 bytes, _printf_pad.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = _printf_post_padding
</UL>
<BR>[Called By]<UL><LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_common
</UL>
<P><STRONG><a name="[35]"></a>_printf_int_dec</STRONG> (Thumb, 90 bytes, Stack size 32 bytes, _printf_dec.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = _printf_int_dec &rArr; _printf_int_common &rArr; _printf_post_padding
</UL>
<BR>[Calls]<UL><LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_udiv10
<LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_common
<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_truncate_unsigned (Weak Reference)
<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_truncate_signed (Weak Reference)
</UL>
<BR>[Called By]<UL><LI><a href="#[33]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_d
</UL>
<P><STRONG><a name="[65]"></a>__printf</STRONG> (Thumb, 270 bytes, Stack size 32 bytes, __printf_wp.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 32 + Unknown Stack Size
<LI>Call Chain = __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_percent
<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_is_digit
</UL>
<BR>[Called By]<UL><LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_char_common
</UL>
<P><STRONG><a name="[ea]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, aeabi_sdiv.o(.text), UNUSED)
<P><STRONG><a name="[49]"></a>__aeabi_uidivmod</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, aeabi_sdiv.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_GetClocksFreq
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART_Init
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemCoreClockUpdate
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_init
</UL>
<P><STRONG><a name="[eb]"></a>__aeabi_idiv</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, aeabi_sdiv.o(.text), UNUSED)
<P><STRONG><a name="[ec]"></a>__aeabi_idivmod</STRONG> (Thumb, 326 bytes, Stack size 8 bytes, aeabi_sdiv.o(.text), UNUSED)
<P><STRONG><a name="[ed]"></a>__use_two_region_memory</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED)
<P><STRONG><a name="[ee]"></a>__rt_heap_escrow$2region</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED)
<P><STRONG><a name="[ef]"></a>__rt_heap_expand$2region</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED)
<P><STRONG><a name="[f0]"></a>__I$use$semihosting</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED)
<P><STRONG><a name="[f1]"></a>__use_no_semihosting_swi</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED)
<P><STRONG><a name="[64]"></a>_printf_int_common</STRONG> (Thumb, 176 bytes, Stack size 40 bytes, _printf_intcommon.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = _printf_int_common &rArr; _printf_post_padding
</UL>
<BR>[Calls]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_post_padding
<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_pre_padding
</UL>
<BR>[Called By]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_dec
</UL>
<P><STRONG><a name="[60]"></a>_printf_char_common</STRONG> (Thumb, 32 bytes, Stack size 64 bytes, _printf_char_common.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 96 + Unknown Stack Size
<LI>Call Chain = _printf_char_common &rArr; __printf
</UL>
<BR>[Calls]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__printf
</UL>
<BR>[Called By]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
</UL>
<P><STRONG><a name="[2a]"></a>_sputc</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, _sputc.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
</UL>
<BR>[Address Reference Count : 1]<UL><LI> noretval__2sprintf.o(.text)
</UL>
<P><STRONG><a name="[63]"></a>__rt_udiv10</STRONG> (Thumb, 40 bytes, Stack size 0 bytes, rtudiv10.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_dec
</UL>
<P><STRONG><a name="[37]"></a>__user_setup_stackheap</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, sys_stackheap_outer.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8 + Unknown Stack Size
<LI>Call Chain = __user_setup_stackheap
</UL>
<BR>[Calls]<UL><LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_perproc_libspace
<LI><a href="#[2e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_initial_stackheap
</UL>
<BR>[Called By]<UL><LI><a href="#[36]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_sh
</UL>
<P><STRONG><a name="[3c]"></a>exit</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, exit.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8 + Unknown Stack Size
<LI>Call Chain = exit
</UL>
<BR>[Calls]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_exit
<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_call_atexit_fns (Weak Reference)
</UL>
<BR>[Called By]<UL><LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_entry_main
</UL>
<P><STRONG><a name="[f2]"></a>__user_libspace</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED)
<P><STRONG><a name="[6a]"></a>__user_perproc_libspace</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text))
<BR><BR>[Called By]<UL><LI><a href="#[37]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__user_setup_stackheap
</UL>
<P><STRONG><a name="[f3]"></a>__user_perthread_libspace</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED)
<P><STRONG><a name="[66]"></a>_is_digit</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, __printf_wp.o(i._is_digit))
<BR><BR>[Called By]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__printf
</UL>
<P>
<H3>
Local Symbols
</H3>
<P><STRONG><a name="[47]"></a>SetSysClock</STRONG> (Thumb, 206 bytes, Stack size 12 bytes, system_stm32f0xx.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = SetSysClock
</UL>
<BR>[Called By]<UL><LI><a href="#[28]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemInit
</UL>
<P><STRONG><a name="[2b]"></a>_printf_input_char</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, _printf_char_common.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> _printf_char_common.o(.text)
</UL><P>
<H3>
Undefined Global Symbols
</H3>
<P><STRONG><a name="[6b]"></a>_call_atexit_fns</STRONG> (ARM, 0 bytes, Stack size 0 bytes, UNDEFINED)
<BR><BR>[Called By]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;exit
</UL>
<P><STRONG><a name="[61]"></a>_printf_truncate_signed</STRONG> (ARM, 0 bytes, Stack size 0 bytes, UNDEFINED)
<BR><BR>[Called By]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_dec
</UL>
<P><STRONG><a name="[62]"></a>_printf_truncate_unsigned</STRONG> (ARM, 0 bytes, Stack size 0 bytes, UNDEFINED)
<BR><BR>[Called By]<UL><LI><a href="#[35]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_int_dec
</UL>
<HR></body></html>

View File

@@ -0,0 +1,14 @@
--cpu Cortex-M0
"..\obj\main.o"
"..\obj\stm32f0xx_it.o"
"..\obj\system_stm32f0xx.o"
"..\obj\startup_stm32f0xx.o"
"..\obj\usart1.o"
"..\obj\delay.o"
"..\obj\stm32f0xx_gpio.o"
"..\obj\stm32f0xx_rcc.o"
"..\obj\stm32f0xx_misc.o"
"..\obj\stm32f0xx_usart.o"
--ro-base 0x08000000 --entry 0x08000000 --rw-base 0x20000000 --entry Reset_Handler --first __Vectors --strict --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\TEST.map" -o ..\OBJ\TEST.axf

View File

@@ -0,0 +1,14 @@
..\obj\delay.o: ..\SYSTEM\delay.c
..\obj\delay.o: ..\SYSTEM\delay.h
..\obj\delay.o: ..\User\stm32f0xx.h
..\obj\delay.o: ..\CORE\core_cm0.h
..\obj\delay.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\delay.o: ..\CORE\core_cmInstr.h
..\obj\delay.o: ..\CORE\core_cmFunc.h
..\obj\delay.o: ..\User\system_stm32f0xx.h
..\obj\delay.o: ..\User\stm32f0xx_conf.h
..\obj\delay.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\delay.o: ..\User\stm32f0xx.h
..\obj\delay.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\delay.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\delay.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,17 @@
del *.crf /s
del *.d /s
del *.o /s
del *.htm /s
del *.tra /s
del *.axf /s
del *.lnp /s
del *.plg /s
del *.iex /s
del *.map /s
del *.dep /s
del *.bak /s
del *.lst /s
del *.uvopt/s
del *.uvgui.*/s
exit

View File

@@ -0,0 +1,14 @@
..\obj\key.o: ..\HARDWARE\Key.c
..\obj\key.o: ..\User\stm32f0xx.h
..\obj\key.o: ..\CORE\core_cm0.h
..\obj\key.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\key.o: ..\CORE\core_cmInstr.h
..\obj\key.o: ..\CORE\core_cmFunc.h
..\obj\key.o: ..\User\system_stm32f0xx.h
..\obj\key.o: ..\User\stm32f0xx_conf.h
..\obj\key.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\key.o: ..\User\stm32f0xx.h
..\obj\key.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\key.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\key.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h
..\obj\key.o: ..\SYSTEM\delay.h

View File

@@ -0,0 +1,14 @@
..\obj\led.o: ..\HARDWARE\led.c
..\obj\led.o: ..\HARDWARE\LED.h
..\obj\led.o: ..\User\stm32f0xx.h
..\obj\led.o: ..\CORE\core_cm0.h
..\obj\led.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\led.o: ..\CORE\core_cmInstr.h
..\obj\led.o: ..\CORE\core_cmFunc.h
..\obj\led.o: ..\User\system_stm32f0xx.h
..\obj\led.o: ..\User\stm32f0xx_conf.h
..\obj\led.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\led.o: ..\User\stm32f0xx.h
..\obj\led.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\led.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\led.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,18 @@
..\obj\main.o: main.c
..\obj\main.o: stm32f0xx.h
..\obj\main.o: ..\CORE\core_cm0.h
..\obj\main.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\main.o: ..\CORE\core_cmInstr.h
..\obj\main.o: ..\CORE\core_cmFunc.h
..\obj\main.o: system_stm32f0xx.h
..\obj\main.o: stm32f0xx_conf.h
..\obj\main.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\main.o: ..\User\stm32f0xx.h
..\obj\main.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\main.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\main.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h
..\obj\main.o: ..\SYSTEM\delay.h
..\obj\main.o: ..\HARDWARE\led.h
..\obj\main.o: ..\HARDWARE\USART1.h
..\obj\main.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
..\obj\main.o: ..\HARDWARE\Key.h

View File

@@ -0,0 +1,14 @@
..\obj\stm32f0xx_gpio.o: ..\STM32F03x_FWLib\src\stm32f0xx_gpio.c
..\obj\stm32f0xx_gpio.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\stm32f0xx_gpio.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_gpio.o: ..\CORE\core_cm0.h
..\obj\stm32f0xx_gpio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\stm32f0xx_gpio.o: ..\CORE\core_cmInstr.h
..\obj\stm32f0xx_gpio.o: ..\CORE\core_cmFunc.h
..\obj\stm32f0xx_gpio.o: ..\User\system_stm32f0xx.h
..\obj\stm32f0xx_gpio.o: ..\User\stm32f0xx_conf.h
..\obj\stm32f0xx_gpio.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\stm32f0xx_gpio.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\stm32f0xx_gpio.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_gpio.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\stm32f0xx_gpio.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,14 @@
..\obj\stm32f0xx_it.o: stm32f0xx_it.c
..\obj\stm32f0xx_it.o: stm32f0xx_it.h
..\obj\stm32f0xx_it.o: stm32f0xx.h
..\obj\stm32f0xx_it.o: ..\CORE\core_cm0.h
..\obj\stm32f0xx_it.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\stm32f0xx_it.o: ..\CORE\core_cmInstr.h
..\obj\stm32f0xx_it.o: ..\CORE\core_cmFunc.h
..\obj\stm32f0xx_it.o: system_stm32f0xx.h
..\obj\stm32f0xx_it.o: stm32f0xx_conf.h
..\obj\stm32f0xx_it.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\stm32f0xx_it.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_it.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\stm32f0xx_it.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\stm32f0xx_it.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,14 @@
..\obj\stm32f0xx_misc.o: ..\STM32F03x_FWLib\src\stm32f0xx_misc.c
..\obj\stm32f0xx_misc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h
..\obj\stm32f0xx_misc.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_misc.o: ..\CORE\core_cm0.h
..\obj\stm32f0xx_misc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\stm32f0xx_misc.o: ..\CORE\core_cmInstr.h
..\obj\stm32f0xx_misc.o: ..\CORE\core_cmFunc.h
..\obj\stm32f0xx_misc.o: ..\User\system_stm32f0xx.h
..\obj\stm32f0xx_misc.o: ..\User\stm32f0xx_conf.h
..\obj\stm32f0xx_misc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\stm32f0xx_misc.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_misc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\stm32f0xx_misc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\stm32f0xx_misc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,14 @@
..\obj\stm32f0xx_rcc.o: ..\STM32F03x_FWLib\src\stm32f0xx_rcc.c
..\obj\stm32f0xx_rcc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\stm32f0xx_rcc.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_rcc.o: ..\CORE\core_cm0.h
..\obj\stm32f0xx_rcc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\stm32f0xx_rcc.o: ..\CORE\core_cmInstr.h
..\obj\stm32f0xx_rcc.o: ..\CORE\core_cmFunc.h
..\obj\stm32f0xx_rcc.o: ..\User\system_stm32f0xx.h
..\obj\stm32f0xx_rcc.o: ..\User\stm32f0xx_conf.h
..\obj\stm32f0xx_rcc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\stm32f0xx_rcc.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_rcc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\stm32f0xx_rcc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\stm32f0xx_rcc.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,14 @@
..\obj\stm32f0xx_usart.o: ..\STM32F03x_FWLib\src\stm32f0xx_usart.c
..\obj\stm32f0xx_usart.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\stm32f0xx_usart.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_usart.o: ..\CORE\core_cm0.h
..\obj\stm32f0xx_usart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\stm32f0xx_usart.o: ..\CORE\core_cmInstr.h
..\obj\stm32f0xx_usart.o: ..\CORE\core_cmFunc.h
..\obj\stm32f0xx_usart.o: ..\User\system_stm32f0xx.h
..\obj\stm32f0xx_usart.o: ..\User\stm32f0xx_conf.h
..\obj\stm32f0xx_usart.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\stm32f0xx_usart.o: ..\User\stm32f0xx.h
..\obj\stm32f0xx_usart.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\stm32f0xx_usart.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\stm32f0xx_usart.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,13 @@
..\obj\system_stm32f0xx.o: system_stm32f0xx.c
..\obj\system_stm32f0xx.o: stm32f0xx.h
..\obj\system_stm32f0xx.o: ..\CORE\core_cm0.h
..\obj\system_stm32f0xx.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\system_stm32f0xx.o: ..\CORE\core_cmInstr.h
..\obj\system_stm32f0xx.o: ..\CORE\core_cmFunc.h
..\obj\system_stm32f0xx.o: system_stm32f0xx.h
..\obj\system_stm32f0xx.o: stm32f0xx_conf.h
..\obj\system_stm32f0xx.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\system_stm32f0xx.o: ..\User\stm32f0xx.h
..\obj\system_stm32f0xx.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\system_stm32f0xx.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\system_stm32f0xx.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h

View File

@@ -0,0 +1,15 @@
..\obj\usart1.o: ..\HARDWARE\USART1.c
..\obj\usart1.o: ..\HARDWARE\USART1.h
..\obj\usart1.o: ..\User\stm32f0xx.h
..\obj\usart1.o: ..\CORE\core_cm0.h
..\obj\usart1.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\usart1.o: ..\CORE\core_cmInstr.h
..\obj\usart1.o: ..\CORE\core_cmFunc.h
..\obj\usart1.o: ..\User\system_stm32f0xx.h
..\obj\usart1.o: ..\User\stm32f0xx_conf.h
..\obj\usart1.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\usart1.o: ..\User\stm32f0xx.h
..\obj\usart1.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\usart1.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\usart1.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h
..\obj\usart1.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h

View File

@@ -0,0 +1,15 @@
..\obj\usart1_api.o: ..\HARDWARE\USART1_API.c
..\obj\usart1_api.o: ..\HARDWARE\USART1.h
..\obj\usart1_api.o: ..\User\stm32f0xx.h
..\obj\usart1_api.o: ..\CORE\core_cm0.h
..\obj\usart1_api.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\usart1_api.o: ..\CORE\core_cmInstr.h
..\obj\usart1_api.o: ..\CORE\core_cmFunc.h
..\obj\usart1_api.o: ..\User\system_stm32f0xx.h
..\obj\usart1_api.o: ..\User\stm32f0xx_conf.h
..\obj\usart1_api.o: ..\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
..\obj\usart1_api.o: ..\User\stm32f0xx.h
..\obj\usart1_api.o: ..\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
..\obj\usart1_api.o: ..\STM32F03x_FWLib\inc\stm32f0xx_usart.h
..\obj\usart1_api.o: ..\STM32F03x_FWLib\inc\stm32f0xx_misc.h
..\obj\usart1_api.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h

View File

@@ -0,0 +1,432 @@
/**
******************************************************************************
* @file stm32f0xx_adc.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the ADC firmware
* library
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_ADC_H
#define __STM32F0XX_ADC_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup ADC
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief ADC Init structure definition
*/
typedef struct
{
uint32_t ADC_Resolution; /*!< Selects the resolution of the conversion.
This parameter can be a value of @ref ADC_Resolution */
FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in
Continuous or Single mode.
This parameter can be set to ENABLE or DISABLE. */
uint32_t ADC_ExternalTrigConvEdge; /*!< Selects the external trigger Edge and enables the
trigger of a regular group. This parameter can be a value
of @ref ADC_external_trigger_edge_conversion */
uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analog
to digital conversion of regular channels. This parameter
can be a value of @ref ADC_external_trigger_sources_for_channels_conversion */
uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right.
This parameter can be a value of @ref ADC_data_align */
uint32_t ADC_ScanDirection; /*!< Specifies in which direction the channels will be scanned
in the sequence.
This parameter can be a value of @ref ADC_Scan_Direction */
}ADC_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup ADC_Exported_Constants
* @{
*/
#define IS_ADC_ALL_PERIPH(PERIPH) ((PERIPH) == ADC1)
/** @defgroup ADC_JitterOff
* @{
*/
#define ADC_JitterOff_PCLKDiv2 ADC_CFGR2_JITOFFDIV2
#define ADC_JitterOff_PCLKDiv4 ADC_CFGR2_JITOFFDIV4
#define IS_ADC_JITTEROFF(JITTEROFF) (((JITTEROFF) & 0x3FFFFFFF) == (uint32_t)RESET)
/**
* @}
*/
/** @defgroup ADC_Resolution
* @{
*/
#define ADC_Resolution_12b ((uint32_t)0x00000000)
#define ADC_Resolution_10b ADC_CFGR1_RES_0
#define ADC_Resolution_8b ADC_CFGR1_RES_1
#define ADC_Resolution_6b ADC_CFGR1_RES
#define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_Resolution_12b) || \
((RESOLUTION) == ADC_Resolution_10b) || \
((RESOLUTION) == ADC_Resolution_8b) || \
((RESOLUTION) == ADC_Resolution_6b))
/**
* @}
*/
/** @defgroup ADC_external_trigger_edge_conversion
* @{
*/
#define ADC_ExternalTrigConvEdge_None ((uint32_t)0x00000000)
#define ADC_ExternalTrigConvEdge_Rising ADC_CFGR1_EXTEN_0
#define ADC_ExternalTrigConvEdge_Falling ADC_CFGR1_EXTEN_1
#define ADC_ExternalTrigConvEdge_RisingFalling ADC_CFGR1_EXTEN
#define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigConvEdge_None) || \
((EDGE) == ADC_ExternalTrigConvEdge_Rising) || \
((EDGE) == ADC_ExternalTrigConvEdge_Falling) || \
((EDGE) == ADC_ExternalTrigConvEdge_RisingFalling))
/**
* @}
*/
/** @defgroup ADC_external_trigger_sources_for_channels_conversion
* @{
*/
/* TIM1 */
#define ADC_ExternalTrigConv_T1_TRGO ((uint32_t)0x00000000)
#define ADC_ExternalTrigConv_T1_CC4 ADC_CFGR1_EXTSEL_0
/* TIM2 */
#define ADC_ExternalTrigConv_T2_TRGO ADC_CFGR1_EXTSEL_1
/* TIM3 */
#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)(ADC_CFGR1_EXTSEL_0 | ADC_CFGR1_EXTSEL_1))
/* TIM15 */
#define ADC_ExternalTrigConv_T15_TRGO ADC_CFGR1_EXTSEL_2
#define IS_ADC_EXTERNAL_TRIG_CONV(CONV) (((CONV) == ADC_ExternalTrigConv_T1_TRGO) || \
((CONV) == ADC_ExternalTrigConv_T1_CC4) || \
((CONV) == ADC_ExternalTrigConv_T2_TRGO) || \
((CONV) == ADC_ExternalTrigConv_T3_TRGO) || \
((CONV) == ADC_ExternalTrigConv_T15_TRGO))
/**
* @}
*/
/** @defgroup ADC_data_align
* @{
*/
#define ADC_DataAlign_Right ((uint32_t)0x00000000)
#define ADC_DataAlign_Left ADC_CFGR1_ALIGN
#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \
((ALIGN) == ADC_DataAlign_Left))
/**
* @}
*/
/** @defgroup ADC_Scan_Direction
* @{
*/
#define ADC_ScanDirection_Upward ((uint32_t)0x00000000)
#define ADC_ScanDirection_Backward ADC_CFGR1_SCANDIR
#define IS_ADC_SCAN_DIRECTION(DIRECTION) (((DIRECTION) == ADC_ScanDirection_Upward) || \
((DIRECTION) == ADC_ScanDirection_Backward))
/**
* @}
*/
/** @defgroup ADC_Scan_Direction
* @{
*/
#define ADC_DMAMode_OneShot ((uint32_t)0x00000000)
#define ADC_DMAMode_Circular ADC_CFGR1_DMACFG
#define IS_ADC_DMA_MODE(MODE) (((MODE) == ADC_DMAMode_OneShot) || \
((MODE) == ADC_DMAMode_Circular))
/**
* @}
*/
/** @defgroup ADC_analog_watchdog_selection
* @{
*/
#define ADC_AnalogWatchdog_Channel_0 ((uint32_t)0x00000000)
#define ADC_AnalogWatchdog_Channel_1 ((uint32_t)0x04000000)
#define ADC_AnalogWatchdog_Channel_2 ((uint32_t)0x08000000)
#define ADC_AnalogWatchdog_Channel_3 ((uint32_t)0x0C000000)
#define ADC_AnalogWatchdog_Channel_4 ((uint32_t)0x10000000)
#define ADC_AnalogWatchdog_Channel_5 ((uint32_t)0x14000000)
#define ADC_AnalogWatchdog_Channel_6 ((uint32_t)0x18000000)
#define ADC_AnalogWatchdog_Channel_7 ((uint32_t)0x1C000000)
#define ADC_AnalogWatchdog_Channel_8 ((uint32_t)0x20000000)
#define ADC_AnalogWatchdog_Channel_9 ((uint32_t)0x24000000)
#define ADC_AnalogWatchdog_Channel_10 ((uint32_t)0x28000000)
#define ADC_AnalogWatchdog_Channel_11 ((uint32_t)0x2C000000)
#define ADC_AnalogWatchdog_Channel_12 ((uint32_t)0x30000000)
#define ADC_AnalogWatchdog_Channel_13 ((uint32_t)0x34000000)
#define ADC_AnalogWatchdog_Channel_14 ((uint32_t)0x38000000)
#define ADC_AnalogWatchdog_Channel_15 ((uint32_t)0x3C000000)
#define ADC_AnalogWatchdog_Channel_16 ((uint32_t)0x40000000)
#define ADC_AnalogWatchdog_Channel_17 ((uint32_t)0x44000000)
#define ADC_AnalogWatchdog_Channel_18 ((uint32_t)0x48000000)
#define IS_ADC_ANALOG_WATCHDOG_CHANNEL(CHANNEL) (((CHANNEL) == ADC_AnalogWatchdog_Channel_0) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_1) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_2) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_3) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_4) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_5) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_6) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_7) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_8) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_9) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_10) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_11) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_12) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_13) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_14) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_15) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_16) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_17) || \
((CHANNEL) == ADC_AnalogWatchdog_Channel_18))
/**
* @}
*/
/** @defgroup ADC_sampling_times
* @{
*/
#define ADC_SampleTime_1_5Cycles ((uint32_t)0x00000000)
#define ADC_SampleTime_7_5Cycles ((uint32_t)0x00000001)
#define ADC_SampleTime_13_5Cycles ((uint32_t)0x00000002)
#define ADC_SampleTime_28_5Cycles ((uint32_t)0x00000003)
#define ADC_SampleTime_41_5Cycles ((uint32_t)0x00000004)
#define ADC_SampleTime_55_5Cycles ((uint32_t)0x00000005)
#define ADC_SampleTime_71_5Cycles ((uint32_t)0x00000006)
#define ADC_SampleTime_239_5Cycles ((uint32_t)0x00000007)
#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1_5Cycles) || \
((TIME) == ADC_SampleTime_7_5Cycles) || \
((TIME) == ADC_SampleTime_13_5Cycles) || \
((TIME) == ADC_SampleTime_28_5Cycles) || \
((TIME) == ADC_SampleTime_41_5Cycles) || \
((TIME) == ADC_SampleTime_55_5Cycles) || \
((TIME) == ADC_SampleTime_71_5Cycles) || \
((TIME) == ADC_SampleTime_239_5Cycles))
/**
* @}
*/
/** @defgroup ADC_thresholds
* @{
*/
#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF)
/**
* @}
*/
/** @defgroup ADC_channels
* @{
*/
#define ADC_Channel_0 ADC_CHSELR_CHSEL0
#define ADC_Channel_1 ADC_CHSELR_CHSEL1
#define ADC_Channel_2 ADC_CHSELR_CHSEL2
#define ADC_Channel_3 ADC_CHSELR_CHSEL3
#define ADC_Channel_4 ADC_CHSELR_CHSEL4
#define ADC_Channel_5 ADC_CHSELR_CHSEL5
#define ADC_Channel_6 ADC_CHSELR_CHSEL6
#define ADC_Channel_7 ADC_CHSELR_CHSEL7
#define ADC_Channel_8 ADC_CHSELR_CHSEL8
#define ADC_Channel_9 ADC_CHSELR_CHSEL9
#define ADC_Channel_10 ADC_CHSELR_CHSEL10
#define ADC_Channel_11 ADC_CHSELR_CHSEL11
#define ADC_Channel_12 ADC_CHSELR_CHSEL12
#define ADC_Channel_13 ADC_CHSELR_CHSEL13
#define ADC_Channel_14 ADC_CHSELR_CHSEL14
#define ADC_Channel_15 ADC_CHSELR_CHSEL15
#define ADC_Channel_16 ADC_CHSELR_CHSEL16
#define ADC_Channel_17 ADC_CHSELR_CHSEL17
#define ADC_Channel_18 ADC_CHSELR_CHSEL18
#define ADC_Channel_TempSensor ((uint32_t)ADC_Channel_16)
#define ADC_Channel_Vrefint ((uint32_t)ADC_Channel_17)
#define ADC_Channel_Vbat ((uint32_t)ADC_Channel_18)
#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) != (uint32_t)RESET) && (((CHANNEL) & 0xFFF80000) == (uint32_t)RESET))
/**
* @}
*/
/** @defgroup ADC_interrupts_definition
* @{
*/
#define ADC_IT_ADRDY ADC_IER_ADRDYIE
#define ADC_IT_EOSMP ADC_IER_EOSMPIE
#define ADC_IT_EOC ADC_IER_EOCIE
#define ADC_IT_EOSEQ ADC_IER_EOSEQIE
#define ADC_IT_OVR ADC_IER_OVRIE
#define ADC_IT_AWD ADC_IER_AWDIE
#define IS_ADC_CONFIG_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFFFF60) == (uint32_t)RESET))
#define IS_ADC_GET_IT(IT) (((IT) == ADC_IT_ADRDY) || ((IT) == ADC_IT_EOSMP) || \
((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_EOSEQ) || \
((IT) == ADC_IT_OVR) || ((IT) == ADC_IT_AWD))
#define IS_ADC_CLEAR_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFFFF60) == (uint32_t)RESET))
/**
* @}
*/
/** @defgroup ADC_flags_definition
* @{
*/
#define ADC_FLAG_ADRDY ADC_ISR_ADRDY
#define ADC_FLAG_EOSMP ADC_ISR_EOSMP
#define ADC_FLAG_EOC ADC_ISR_EOC
#define ADC_FLAG_EOSEQ ADC_ISR_EOSEQ
#define ADC_FLAG_OVR ADC_ISR_OVR
#define ADC_FLAG_AWD ADC_ISR_AWD
#define ADC_FLAG_ADEN ((uint32_t)0x01000001)
#define ADC_FLAG_ADDIS ((uint32_t)0x01000002)
#define ADC_FLAG_ADSTART ((uint32_t)0x01000004)
#define ADC_FLAG_ADSTP ((uint32_t)0x01000008)
#define ADC_FLAG_ADCAL ((uint32_t)0x11000000)
#define IS_ADC_CLEAR_FLAG(FLAG) (((FLAG) != (uint32_t)RESET) && (((FLAG) & 0xEFFFFF60) == (uint32_t)RESET))
#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_ADRDY) || ((FLAG) == ADC_FLAG_EOSMP) || \
((FLAG) == ADC_FLAG_EOC) || ((FLAG)== ADC_FLAG_EOSEQ) || \
((FLAG) == ADC_FLAG_AWD) || ((FLAG)== ADC_FLAG_OVR) || \
((FLAG) == ADC_FLAG_ADEN) || ((FLAG)== ADC_FLAG_ADDIS) || \
((FLAG) == ADC_FLAG_ADSTART) || ((FLAG)== ADC_FLAG_ADSTP) || \
((FLAG) == ADC_FLAG_ADCAL))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the ADC configuration to the default reset state *****/
void ADC_DeInit(ADC_TypeDef* ADCx);
/* Initialization and Configuration functions *********************************/
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
void ADC_JitterCmd(ADC_TypeDef* ADCx, uint32_t ADC_JitterOff, FunctionalState NewState);
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
/* Power saving functions *****************************************************/
void ADC_AutoPowerOffCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_WaitModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
/* Analog Watchdog configuration functions ************************************/
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold);
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog_Channel);
void ADC_AnalogWatchdogSingleChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
/* Temperature Sensor , Vrefint and Vbat management function ******************/
void ADC_TempSensorCmd(FunctionalState NewState);
void ADC_VrefintCmd(FunctionalState NewState);
void ADC_VbatCmd(FunctionalState NewState);
/* Channels Configuration functions *******************************************/
void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime);
void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_OverrunModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
uint32_t ADC_GetCalibrationFactor(ADC_TypeDef* ADCx);
void ADC_StopOfConversion(ADC_TypeDef* ADCx);
void ADC_StartOfConversion(ADC_TypeDef* ADCx);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
/* Regular Channels DMA Configuration functions *******************************/
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_DMARequestModeConfig(ADC_TypeDef* ADCx, uint32_t ADC_DMARequestMode);
/* Interrupts and flags management functions **********************************/
void ADC_ITConfig(ADC_TypeDef* ADCx, uint32_t ADC_IT, FunctionalState NewState);
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint32_t ADC_FLAG);
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint32_t ADC_FLAG);
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint32_t ADC_IT);
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint32_t ADC_IT);
#ifdef __cplusplus
}
#endif
#endif /*__STM32F0XX_ADC_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,300 @@
/**
******************************************************************************
* @file stm32f0xx_cec.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the CEC firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_CEC_H
#define __STM32F0XX_CEC_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup CEC
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief CEC Init structure definition
*/
typedef struct
{
uint32_t CEC_SignalFreeTime; /*!< Specifies the CEC Signal Free Time configuration.
This parameter can be a value of @ref CEC_Signal_Free_Time */
uint32_t CEC_RxTolerance; /*!< Specifies the CEC Reception Tolerance.
This parameter can be a value of @ref CEC_RxTolerance */
uint32_t CEC_StopReception; /*!< Specifies the CEC Stop Reception.
This parameter can be a value of @ref CEC_Stop_Reception */
uint32_t CEC_BitRisingError; /*!< Specifies the CEC Bit Rising Error generation.
This parameter can be a value of @ref CEC_Bit_Rising_Error_Generation */
uint32_t CEC_LongBitPeriodError; /*!< Specifies the CEC Long Bit Error generation.
This parameter can be a value of @ref CEC_Long_Bit_Error_Generation */
uint32_t CEC_BRDNoGen; /*!< Specifies the CEC Broadcast Error generation.
This parameter can be a value of @ref CEC_BDR_No_Gen */
uint32_t CEC_SFTOption; /*!< Specifies the CEC Signal Free Time option.
This parameter can be a value of @ref CEC_SFT_Option */
}CEC_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup CEC_Exported_Constants
* @{
*/
/** @defgroup CEC_Signal_Free_Time
* @{
*/
#define CEC_SignalFreeTime_Standard ((uint32_t)0x00000000) /*!< CEC Signal Free Time Standard */
#define CEC_SignalFreeTime_1T ((uint32_t)0x00000001) /*!< CEC 1.5 nominal data bit periods */
#define CEC_SignalFreeTime_2T ((uint32_t)0x00000002) /*!< CEC 2.5 nominal data bit periods */
#define CEC_SignalFreeTime_3T ((uint32_t)0x00000003) /*!< CEC 3.5 nominal data bit periods */
#define CEC_SignalFreeTime_4T ((uint32_t)0x00000004) /*!< CEC 4.5 nominal data bit periods */
#define CEC_SignalFreeTime_5T ((uint32_t)0x00000005) /*!< CEC 5.5 nominal data bit periods */
#define CEC_SignalFreeTime_6T ((uint32_t)0x00000006) /*!< CEC 6.5 nominal data bit periods */
#define CEC_SignalFreeTime_7T ((uint32_t)0x00000007) /*!< CEC 7.5 nominal data bit periods */
#define IS_CEC_SIGNAL_FREE_TIME(TIME) (((TIME) == CEC_SignalFreeTime_Standard) || \
((TIME) == CEC_SignalFreeTime_1T)|| \
((TIME) == CEC_SignalFreeTime_2T)|| \
((TIME) == CEC_SignalFreeTime_3T)|| \
((TIME) == CEC_SignalFreeTime_4T)|| \
((TIME) == CEC_SignalFreeTime_5T)|| \
((TIME) == CEC_SignalFreeTime_6T)|| \
((TIME) == CEC_SignalFreeTime_7T))
/**
* @}
*/
/** @defgroup CEC_RxTolerance
* @{
*/
#define CEC_RxTolerance_Standard ((uint32_t)0x00000000) /*!< Standard Tolerance Margin */
#define CEC_RxTolerance_Extended CEC_CFGR_RXTOL /*!< Extended Tolerance Margin */
#define IS_CEC_RX_TOLERANCE(TOLERANCE) (((TOLERANCE) == CEC_RxTolerance_Standard) || \
((TOLERANCE) == CEC_RxTolerance_Extended))
/**
* @}
*/
/** @defgroup CEC_Stop_Reception
* @{
*/
#define CEC_StopReception_Off ((uint32_t)0x00000000) /*!< No RX Stop on bit Rising Error (BRE) */
#define CEC_StopReception_On CEC_CFGR_BRESTP /*!< RX Stop on bit Rising Error (BRE) */
#define IS_CEC_STOP_RECEPTION(RECEPTION) (((RECEPTION) == CEC_StopReception_On) || \
((RECEPTION) == CEC_StopReception_Off))
/**
* @}
*/
/** @defgroup CEC_Bit_Rising_Error_Generation
* @{
*/
#define CEC_BitRisingError_Off ((uint32_t)0x00000000) /*!< Bit Rising Error generation turned Off */
#define CEC_BitRisingError_On CEC_CFGR_BREGEN /*!< Bit Rising Error generation turned On */
#define IS_CEC_BIT_RISING_ERROR(ERROR) (((ERROR) == CEC_BitRisingError_Off) || \
((ERROR) == CEC_BitRisingError_On))
/**
* @}
*/
/** @defgroup CEC_Long_Bit_Error_Generation
* @{
*/
#define CEC_LongBitPeriodError_Off ((uint32_t)0x00000000) /*!< Long Bit Period Error generation turned Off */
#define CEC_LongBitPeriodError_On CEC_CFGR_LREGEN /*!< Long Bit Period Error generation turned On */
#define IS_CEC_LONG_BIT_PERIOD_ERROR(ERROR) (((ERROR) == CEC_LongBitPeriodError_Off) || \
((ERROR) == CEC_LongBitPeriodError_On))
/**
* @}
*/
/** @defgroup CEC_BDR_No_Gen
* @{
*/
#define CEC_BRDNoGen_Off ((uint32_t)0x00000000) /*!< Broadcast Bit Rising Error generation turned Off */
#define CEC_BRDNoGen_On CEC_CFGR_BRDNOGEN /*!< Broadcast Bit Rising Error generation turned On */
#define IS_CEC_BDR_NO_GEN_ERROR(ERROR) (((ERROR) == CEC_BRDNoGen_Off) || \
((ERROR) == CEC_BRDNoGen_On))
/**
* @}
*/
/** @defgroup CEC_SFT_Option
* @{
*/
#define CEC_SFTOption_Off ((uint32_t)0x00000000) /*!< SFT option turned Off */
#define CEC_SFTOption_On CEC_CFGR_SFTOPT /*!< SFT option turned On */
#define IS_CEC_SFT_OPTION(OPTION) (((OPTION) == CEC_SFTOption_Off) || \
((OPTION) == CEC_SFTOption_On))
/**
* @}
*/
/** @defgroup CEC_Own_Address
* @{
*/
#define IS_CEC_ADDRESS(ADDRESS) ((ADDRESS) < 0x10)
/**
* @}
*/
/** @defgroup CEC_Interrupt_Configuration_definition
* @{
*/
#define CEC_IT_TXACKE CEC_IER_TXACKEIE
#define CEC_IT_TXERR CEC_IER_TXERRIE
#define CEC_IT_TXUDR CEC_IER_TXUDRIE
#define CEC_IT_TXEND CEC_IER_TXENDIE
#define CEC_IT_TXBR CEC_IER_TXBRIE
#define CEC_IT_ARBLST CEC_IER_ARBLSTIE
#define CEC_IT_RXACKE CEC_IER_RXACKEIE
#define CEC_IT_LBPE CEC_IER_LBPEIE
#define CEC_IT_SBPE CEC_IER_SBPEIE
#define CEC_IT_BRE CEC_IER_BREIEIE
#define CEC_IT_RXOVR CEC_IER_RXOVRIE
#define CEC_IT_RXEND CEC_IER_RXENDIE
#define CEC_IT_RXBR CEC_IER_RXBRIE
#define IS_CEC_IT(IT) ((((IT) & (uint32_t)0xFFFFE000) == 0x00) && ((IT) != 0x00))
#define IS_CEC_GET_IT(IT) (((IT) == CEC_IT_TXACKE) || \
((IT) == CEC_IT_TXERR)|| \
((IT) == CEC_IT_TXUDR)|| \
((IT) == CEC_IT_TXEND)|| \
((IT) == CEC_IT_TXBR)|| \
((IT) == CEC_IT_ARBLST)|| \
((IT) == CEC_IT_RXACKE)|| \
((IT) == CEC_IT_LBPE)|| \
((IT) == CEC_IT_SBPE)|| \
((IT) == CEC_IT_BRE)|| \
((IT) == CEC_IT_RXOVR)|| \
((IT) == CEC_IT_RXEND)|| \
((IT) == CEC_IT_RXBR))
/**
* @}
*/
/** @defgroup CEC_ISR_register_flags_definition
* @{
*/
#define CEC_FLAG_TXACKE CEC_ISR_TXACKE
#define CEC_FLAG_TXERR CEC_ISR_TXERR
#define CEC_FLAG_TXUDR CEC_ISR_TXUDR
#define CEC_FLAG_TXEND CEC_ISR_TXEND
#define CEC_FLAG_TXBR CEC_ISR_TXBR
#define CEC_FLAG_ARBLST CEC_ISR_ARBLST
#define CEC_FLAG_RXACKE CEC_ISR_RXACKE
#define CEC_FLAG_LBPE CEC_ISR_LBPE
#define CEC_FLAG_SBPE CEC_ISR_SBPE
#define CEC_FLAG_BRE CEC_ISR_BRE
#define CEC_FLAG_RXOVR CEC_ISR_RXOVR
#define CEC_FLAG_RXEND CEC_ISR_RXEND
#define CEC_FLAG_RXBR CEC_ISR_RXBR
#define IS_CEC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFE000) == 0x00) && ((FLAG) != 0x00))
#define IS_CEC_GET_FLAG(FLAG) (((FLAG) == CEC_FLAG_TXACKE) || \
((FLAG) == CEC_FLAG_TXERR)|| \
((FLAG) == CEC_FLAG_TXUDR)|| \
((FLAG) == CEC_FLAG_TXEND)|| \
((FLAG) == CEC_FLAG_TXBR)|| \
((FLAG) == CEC_FLAG_ARBLST)|| \
((FLAG) == CEC_FLAG_RXACKE)|| \
((FLAG) == CEC_FLAG_LBPE)|| \
((FLAG) == CEC_FLAG_SBPE)|| \
((FLAG) == CEC_FLAG_BRE)|| \
((FLAG) == CEC_FLAG_RXOVR)|| \
((FLAG) == CEC_FLAG_RXEND)|| \
((FLAG) == CEC_FLAG_RXBR))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the CEC configuration to the default reset state *****/
void CEC_DeInit(void);
/* CEC_Initialization and Configuration functions *****************************/
void CEC_Init(CEC_InitTypeDef* CEC_InitStruct);
void CEC_StructInit(CEC_InitTypeDef* CEC_InitStruct);
void CEC_Cmd(FunctionalState NewState);
void CEC_ListenModeCmd(FunctionalState NewState);
void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress);
void CEC_OwnAddressClear(void);
/* CEC_Data transfers functions ***********************************************/
void CEC_SendData(uint8_t Data);
uint8_t CEC_ReceiveData(void);
void CEC_StartOfMessage(void);
void CEC_EndOfMessage(void);
/* CEC_Interrupts and flags management functions ******************************/
void CEC_ITConfig(uint16_t CEC_IT, FunctionalState NewState);
FlagStatus CEC_GetFlagStatus(uint16_t CEC_FLAG);
void CEC_ClearFlag(uint32_t CEC_FLAG);
ITStatus CEC_GetITStatus(uint16_t CEC_IT);
void CEC_ClearITPendingBit(uint16_t CEC_IT);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_CEC_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,243 @@
/**
******************************************************************************
* @file stm32f0xx_comp.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the COMP firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_COMP_H
#define __STM32F0XX_COMP_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup COMP
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief COMP Init structure definition
*/
typedef struct
{
uint32_t COMP_InvertingInput; /*!< Selects the inverting input of the comparator.
This parameter can be a value of @ref COMP_InvertingInput */
uint32_t COMP_Output; /*!< Selects the output redirection of the comparator.
This parameter can be a value of @ref COMP_Output */
uint32_t COMP_OutputPol; /*!< Selects the output polarity of the comparator.
This parameter can be a value of @ref COMP_OutputPolarity */
uint32_t COMP_Hysteresis; /*!< Selects the hysteresis voltage of the comparator.
This parameter can be a value of @ref COMP_Hysteresis */
uint32_t COMP_Mode; /*!< Selects the operating mode of the comparator
and allows to adjust the speed/consumption.
This parameter can be a value of @ref COMP_Mode */
}COMP_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup COMP_Exported_Constants
* @{
*/
/** @defgroup COMP_Selection
* @{
*/
#define COMP_Selection_COMP1 ((uint32_t)0x00000000) /*!< COMP1 Selection */
#define COMP_Selection_COMP2 ((uint32_t)0x00000010) /*!< COMP2 Selection */
#define IS_COMP_ALL_PERIPH(PERIPH) (((PERIPH) == COMP_Selection_COMP1) || \
((PERIPH) == COMP_Selection_COMP2))
/**
* @}
*/
/** @defgroup COMP_InvertingInput
* @{
*/
#define COMP_InvertingInput_1_4VREFINT ((uint32_t)0x00000000) /*!< 1/4 VREFINT connected to comparator inverting input */
#define COMP_InvertingInput_1_2VREFINT COMP_CSR_COMP1INSEL_0 /*!< 1/2 VREFINT connected to comparator inverting input */
#define COMP_InvertingInput_3_4VREFINT COMP_CSR_COMP1INSEL_1 /*!< 3/4 VREFINT connected to comparator inverting input */
#define COMP_InvertingInput_VREFINT ((uint32_t)0x00000030) /*!< VREFINT connected to comparator inverting input */
#define COMP_InvertingInput_DAC1 COMP_CSR_COMP1INSEL_2 /*!< DAC1_OUT connected to comparator inverting input */
#define COMP_InvertingInput_IO ((uint32_t)0x00000060) /*!< I/O (PA0 for COMP1 and PA2 for COMP2) connected to comparator inverting input */
#define IS_COMP_INVERTING_INPUT(INPUT) (((INPUT) == COMP_InvertingInput_1_4VREFINT) || \
((INPUT) == COMP_InvertingInput_1_2VREFINT) || \
((INPUT) == COMP_InvertingInput_3_4VREFINT) || \
((INPUT) == COMP_InvertingInput_VREFINT) || \
((INPUT) == COMP_InvertingInput_DAC1) || \
((INPUT) == COMP_InvertingInput_1_4VREFINT) || \
((INPUT) == COMP_InvertingInput_IO))
/**
* @}
*/
/** @defgroup COMP_Output
* @{
*/
#define COMP_Output_None ((uint32_t)0x00000000) /*!< COMP output isn't connected to other peripherals */
#define COMP_Output_TIM1BKIN COMP_CSR_COMP1OUTSEL_0 /*!< COMP output connected to TIM1 Break Input (BKIN) */
#define COMP_Output_TIM1IC1 COMP_CSR_COMP1OUTSEL_1 /*!< COMP output connected to TIM1 Input Capture 1 */
#define COMP_Output_TIM1OCREFCLR ((uint32_t)0x00000300) /*!< COMP output connected to TIM1 OCREF Clear */
#define COMP_Output_TIM2IC4 COMP_CSR_COMP1OUTSEL_2 /*!< COMP output connected to TIM2 Input Capture 4 */
#define COMP_Output_TIM2OCREFCLR ((uint32_t)0x00000500) /*!< COMP output connected to TIM2 OCREF Clear */
#define COMP_Output_TIM3IC1 ((uint32_t)0x00000600) /*!< COMP output connected to TIM3 Input Capture 1 */
#define COMP_Output_TIM3OCREFCLR COMP_CSR_COMP1OUTSEL /*!< COMP output connected to TIM3 OCREF Clear */
#define IS_COMP_OUTPUT(OUTPUT) (((OUTPUT) == COMP_Output_None) || \
((OUTPUT) == COMP_Output_TIM1BKIN) || \
((OUTPUT) == COMP_Output_TIM1IC1) || \
((OUTPUT) == COMP_Output_TIM1OCREFCLR) || \
((OUTPUT) == COMP_Output_TIM2IC4) || \
((OUTPUT) == COMP_Output_TIM2OCREFCLR) || \
((OUTPUT) == COMP_Output_TIM3IC1) || \
((OUTPUT) == COMP_Output_TIM3OCREFCLR))
/**
* @}
*/
/** @defgroup COMP_OutputPolarity
* @{
*/
#define COMP_OutputPol_NonInverted ((uint32_t)0x00000000) /*!< COMP output on GPIO isn't inverted */
#define COMP_OutputPol_Inverted COMP_CSR_COMP1POL /*!< COMP output on GPIO is inverted */
#define IS_COMP_OUTPUT_POL(POL) (((POL) == COMP_OutputPol_NonInverted) || \
((POL) == COMP_OutputPol_Inverted))
/**
* @}
*/
/** @defgroup COMP_Hysteresis
* @{
*/
/* Please refer to the electrical characteristics in the device datasheet for
the hysteresis level */
#define COMP_Hysteresis_No 0x00000000 /*!< No hysteresis */
#define COMP_Hysteresis_Low COMP_CSR_COMP1HYST_0 /*!< Hysteresis level low */
#define COMP_Hysteresis_Medium COMP_CSR_COMP1HYST_1 /*!< Hysteresis level medium */
#define COMP_Hysteresis_High COMP_CSR_COMP1HYST /*!< Hysteresis level high */
#define IS_COMP_HYSTERESIS(HYSTERESIS) (((HYSTERESIS) == COMP_Hysteresis_No) || \
((HYSTERESIS) == COMP_Hysteresis_Low) || \
((HYSTERESIS) == COMP_Hysteresis_Medium) || \
((HYSTERESIS) == COMP_Hysteresis_High))
/**
* @}
*/
/** @defgroup COMP_Mode
* @{
*/
/* Please refer to the electrical characteristics in the device datasheet for
the power consumption values */
#define COMP_Mode_HighSpeed 0x00000000 /*!< High Speed */
#define COMP_Mode_MediumSpeed COMP_CSR_COMP1MODE_0 /*!< Medium Speed */
#define COMP_Mode_LowPower COMP_CSR_COMP1MODE_1 /*!< Low power mode */
#define COMP_Mode_UltraLowPower COMP_CSR_COMP1MODE /*!< Ultra-low power mode */
#define IS_COMP_MODE(MODE) (((MODE) == COMP_Mode_UltraLowPower) || \
((MODE) == COMP_Mode_LowPower) || \
((MODE) == COMP_Mode_MediumSpeed) || \
((MODE) == COMP_Mode_HighSpeed))
/**
* @}
*/
/** @defgroup COMP_OutputLevel
* @{
*/
/* When output polarity is not inverted, comparator output is high when
the non-inverting input is at a higher voltage than the inverting input */
#define COMP_OutputLevel_High COMP_CSR_COMP1OUT
/* When output polarity is not inverted, comparator output is low when
the non-inverting input is at a lower voltage than the inverting input*/
#define COMP_OutputLevel_Low ((uint32_t)0x00000000)
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the COMP configuration to the default reset state ****/
void COMP_DeInit(void);
/* Initialization and Configuration functions *********************************/
void COMP_Init(uint32_t COMP_Selection, COMP_InitTypeDef* COMP_InitStruct);
void COMP_StructInit(COMP_InitTypeDef* COMP_InitStruct);
void COMP_Cmd(uint32_t COMP_Selection, FunctionalState NewState);
void COMP_SwitchCmd(FunctionalState NewState);
uint32_t COMP_GetOutputLevel(uint32_t COMP_Selection);
/* Window mode control function ***********************************************/
void COMP_WindowCmd(FunctionalState NewState);
/* COMP configuration locking function ****************************************/
void COMP_LockConfig(uint32_t COMP_Selection);
#ifdef __cplusplus
}
#endif
#endif /*__STM32F0XX_COMP_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,100 @@
/**
******************************************************************************
* @file stm32f0xx_crc.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the CRC firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_CRC_H
#define __STM32F0XX_CRC_H
#ifdef __cplusplus
extern "C" {
#endif
/*!< Includes ----------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup CRC
* @{
*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup CRC_Exported_Constants
* @{
*/
#define CRC_ReverseInputData_No ((uint32_t)0x00000000) /*!< No reverse operation of Input Data */
#define CRC_ReverseInputData_8bits CRC_CR_REV_IN_0 /*!< Reverse operation of Input Data on 8 bits */
#define CRC_ReverseInputData_16bits CRC_CR_REV_IN_1 /*!< Reverse operation of Input Data on 16 bits */
#define CRC_ReverseInputData_32bits CRC_CR_REV_IN /*!< Reverse operation of Input Data on 32 bits */
#define IS_CRC_REVERSE_INPUT_DATA(DATA) (((DATA) == CRC_ReverseInputData_No) || \
((DATA) == CRC_ReverseInputData_8bits) || \
((DATA) == CRC_ReverseInputData_16bits) || \
((DATA) == CRC_ReverseInputData_32bits))
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Configuration of the CRC computation unit **********************************/
void CRC_DeInit(void);
void CRC_ResetDR(void);
void CRC_ReverseInputDataSelect(uint32_t CRC_ReverseInputData);
void CRC_ReverseOutputDataCmd(FunctionalState NewState);
void CRC_SetInitRegister(uint32_t CRC_InitValue);
/* CRC computation ************************************************************/
uint32_t CRC_CalcCRC(uint32_t CRC_Data);
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength);
uint32_t CRC_GetCRC(void);
/* Independent register (IDR) access (write/read) *****************************/
void CRC_SetIDRegister(uint8_t CRC_IDValue);
uint8_t CRC_GetIDRegister(void);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_CRC_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,207 @@
/**
******************************************************************************
* @file stm32f0xx_dac.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the DAC firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_DAC_H
#define __STM32F0XX_DAC_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup DAC
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief DAC Init structure definition
*/
typedef struct
{
uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel.
This parameter can be a value of @ref DAC_Trigger */
uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled.
This parameter can be a value of @ref DAC_OutputBuffer */
}DAC_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup DAC_Exported_Constants
* @{
*/
/** @defgroup DAC_Trigger
* @{
*/
#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register
has been loaded, and not by external trigger */
#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM3 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T15_TRGO ((uint32_t)0x0000001C) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */
#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */
#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \
((TRIGGER) == DAC_Trigger_T6_TRGO) || \
((TRIGGER) == DAC_Trigger_T3_TRGO) || \
((TRIGGER) == DAC_Trigger_T15_TRGO) || \
((TRIGGER) == DAC_Trigger_T2_TRGO) || \
((TRIGGER) == DAC_Trigger_Ext_IT9) || \
((TRIGGER) == DAC_Trigger_Software))
/**
* @}
*/
/** @defgroup DAC_OutputBuffer
* @{
*/
#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000)
#define DAC_OutputBuffer_Disable DAC_CR_BOFF1
#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \
((STATE) == DAC_OutputBuffer_Disable))
/**
* @}
*/
/** @defgroup DAC_Channel_selection
* @{
*/
#define DAC_Channel_1 ((uint32_t)0x00000000)
#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1))
/**
* @}
*/
/** @defgroup DAC_data_alignment
* @{
*/
#define DAC_Align_12b_R ((uint32_t)0x00000000)
#define DAC_Align_12b_L ((uint32_t)0x00000004)
#define DAC_Align_8b_R ((uint32_t)0x00000008)
#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \
((ALIGN) == DAC_Align_12b_L) || \
((ALIGN) == DAC_Align_8b_R))
/**
* @}
*/
/** @defgroup DAC_data
* @{
*/
#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0)
/**
* @}
*/
/** @defgroup DAC_interrupts_definition
* @{
*/
#define DAC_IT_DMAUDR DAC_SR_DMAUDR1
#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR))
/**
* @}
*/
/** @defgroup DAC_flags_definition
* @{
*/
#define DAC_FLAG_DMAUDR DAC_SR_DMAUDR1
#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the DAC configuration to the default reset state *****/
void DAC_DeInit(void);
/* DAC channels configuration: trigger, output buffer, data format functions */
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct);
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState);
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);
/* DMA management functions ***************************************************/
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState);
/* Interrupts and flags management functions **********************************/
void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState);
FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG);
void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG);
ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT);
void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT);
#ifdef __cplusplus
}
#endif
#endif /*__STM32F0XX_DAC_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,105 @@
/**
******************************************************************************
* @file stm32f0xx_dbgmcu.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the DBGMCU firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_DBGMCU_H
#define __STM32F0XX_DBGMCU_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup DBGMCU
* @{
*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup DBGMCU_Exported_Constants
* @{
*/
#define DBGMCU_STOP DBGMCU_CR_DBG_STOP
#define DBGMCU_STANDBY DBGMCU_CR_DBG_STANDBY
#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFFF9) == 0x00) && ((PERIPH) != 0x00))
#define DBGMCU_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP
#define DBGMCU_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP
#define DBGMCU_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP
#define DBGMCU_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP
#define DBGMCU_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP
#define DBGMCU_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP
#define DBGMCU_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP
#define DBGMCU_I2C1_SMBUS_TIMEOUT DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT
#define IS_DBGMCU_APB1PERIPH(PERIPH) ((((PERIPH) & 0xFFDFE2EC) == 0x00) && ((PERIPH) != 0x00))
#define DBGMCU_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP
#define DBGMCU_TIM15_STOP DBGMCU_APB2_FZ_DBG_TIM15_STOP
#define DBGMCU_TIM16_STOP DBGMCU_APB2_FZ_DBG_TIM16_STOP
#define DBGMCU_TIM17_STOP DBGMCU_APB2_FZ_DBG_TIM17_STOP
#define IS_DBGMCU_APB2PERIPH(PERIPH) ((((PERIPH) & 0xFFF8F7FF) == 0x00) && ((PERIPH) != 0x00))
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Device and Revision ID management functions ********************************/
uint32_t DBGMCU_GetREVID(void);
uint32_t DBGMCU_GetDEVID(void);
/* Peripherals Configuration functions ****************************************/
void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState);
void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState);
void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_DBGMCU_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,351 @@
/**
******************************************************************************
* @file stm32f0xx_dma.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the DMA firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_DMA_H
#define __STM32F0XX_DMA_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup DMA
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief DMA Init structures definition
*/
typedef struct
{
uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */
uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */
uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination.
This parameter can be a value of @ref DMA_data_transfer_direction */
uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel.
The data unit is equal to the configuration set in DMA_PeripheralDataSize
or DMA_MemoryDataSize members depending in the transfer direction */
uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not.
This parameter can be a value of @ref DMA_peripheral_incremented_mode */
uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register is incremented or not.
This parameter can be a value of @ref DMA_memory_incremented_mode */
uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width.
This parameter can be a value of @ref DMA_peripheral_data_size */
uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width.
This parameter can be a value of @ref DMA_memory_data_size */
uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Channelx.
This parameter can be a value of @ref DMA_circular_normal_mode
@note: The circular buffer mode cannot be used if the memory-to-memory
data transfer is configured on the selected Channel */
uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Channelx.
This parameter can be a value of @ref DMA_priority_level */
uint32_t DMA_M2M; /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer.
This parameter can be a value of @ref DMA_memory_to_memory */
}DMA_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup DMA_Exported_Constants
* @{
*/
#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Channel1) || \
((PERIPH) == DMA1_Channel2) || \
((PERIPH) == DMA1_Channel3) || \
((PERIPH) == DMA1_Channel4) || \
((PERIPH) == DMA1_Channel5))
/** @defgroup DMA_data_transfer_direction
* @{
*/
#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)
#define DMA_DIR_PeripheralDST DMA_CCR_DIR
#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralSRC) || \
((DIR) == DMA_DIR_PeripheralDST))
/**
* @}
*/
/** @defgroup DMA_peripheral_incremented_mode
* @{
*/
#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000)
#define DMA_PeripheralInc_Enable DMA_CCR_PINC
#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Disable) || \
((STATE) == DMA_PeripheralInc_Enable))
/**
* @}
*/
/** @defgroup DMA_memory_incremented_mode
* @{
*/
#define DMA_MemoryInc_Disable ((uint32_t)0x00000000)
#define DMA_MemoryInc_Enable DMA_CCR_MINC
#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Disable) || \
((STATE) == DMA_MemoryInc_Enable))
/**
* @}
*/
/** @defgroup DMA_peripheral_data_size
* @{
*/
#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000)
#define DMA_PeripheralDataSize_HalfWord DMA_CCR_PSIZE_0
#define DMA_PeripheralDataSize_Word DMA_CCR_PSIZE_1
#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \
((SIZE) == DMA_PeripheralDataSize_HalfWord) || \
((SIZE) == DMA_PeripheralDataSize_Word))
/**
* @}
*/
/** @defgroup DMA_memory_data_size
* @{
*/
#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000)
#define DMA_MemoryDataSize_HalfWord DMA_CCR_MSIZE_0
#define DMA_MemoryDataSize_Word DMA_CCR_MSIZE_1
#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \
((SIZE) == DMA_MemoryDataSize_HalfWord) || \
((SIZE) == DMA_MemoryDataSize_Word))
/**
* @}
*/
/** @defgroup DMA_circular_normal_mode
* @{
*/
#define DMA_Mode_Normal ((uint32_t)0x00000000)
#define DMA_Mode_Circular DMA_CCR_CIRC
#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Normal) || ((MODE) == DMA_Mode_Circular))
/**
* @}
*/
/** @defgroup DMA_priority_level
* @{
*/
#define DMA_Priority_VeryHigh DMA_CCR_PL
#define DMA_Priority_High DMA_CCR_PL_1
#define DMA_Priority_Medium DMA_CCR_PL_0
#define DMA_Priority_Low ((uint32_t)0x00000000)
#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_VeryHigh) || \
((PRIORITY) == DMA_Priority_High) || \
((PRIORITY) == DMA_Priority_Medium) || \
((PRIORITY) == DMA_Priority_Low))
/**
* @}
*/
/** @defgroup DMA_memory_to_memory
* @{
*/
#define DMA_M2M_Disable ((uint32_t)0x00000000)
#define DMA_M2M_Enable DMA_CCR_MEM2MEM
#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Disable) || ((STATE) == DMA_M2M_Enable))
/**
* @}
*/
/** @defgroup DMA_interrupts_definition
* @{
*/
#define DMA_IT_TC DMA_CCR_TCIE
#define DMA_IT_HT DMA_CCR_HTIE
#define DMA_IT_TE DMA_CCR_TEIE
#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00))
#define DMA1_IT_GL1 DMA_ISR_GIF1
#define DMA1_IT_TC1 DMA_ISR_TCIF1
#define DMA1_IT_HT1 DMA_ISR_HTIF1
#define DMA1_IT_TE1 DMA_ISR_TEIF1
#define DMA1_IT_GL2 DMA_ISR_GIF2
#define DMA1_IT_TC2 DMA_ISR_TCIF2
#define DMA1_IT_HT2 DMA_ISR_HTIF2
#define DMA1_IT_TE2 DMA_ISR_TEIF2
#define DMA1_IT_GL3 DMA_ISR_GIF3
#define DMA1_IT_TC3 DMA_ISR_TCIF3
#define DMA1_IT_HT3 DMA_ISR_HTIF3
#define DMA1_IT_TE3 DMA_ISR_TEIF3
#define DMA1_IT_GL4 DMA_ISR_GIF4
#define DMA1_IT_TC4 DMA_ISR_TCIF4
#define DMA1_IT_HT4 DMA_ISR_HTIF4
#define DMA1_IT_TE4 DMA_ISR_TEIF4
#define DMA1_IT_GL5 DMA_ISR_GIF5
#define DMA1_IT_TC5 DMA_ISR_TCIF5
#define DMA1_IT_HT5 DMA_ISR_HTIF5
#define DMA1_IT_TE5 DMA_ISR_TEIF5
#define IS_DMA_CLEAR_IT(IT) ((((IT) & 0xFFF00000) == 0x00) && ((IT) != 0x00))
#define IS_DMA_GET_IT(IT) (((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \
((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \
((IT) == DMA1_IT_GL2) || ((IT) == DMA1_IT_TC2) || \
((IT) == DMA1_IT_HT2) || ((IT) == DMA1_IT_TE2) || \
((IT) == DMA1_IT_GL3) || ((IT) == DMA1_IT_TC3) || \
((IT) == DMA1_IT_HT3) || ((IT) == DMA1_IT_TE3) || \
((IT) == DMA1_IT_GL4) || ((IT) == DMA1_IT_TC4) || \
((IT) == DMA1_IT_HT4) || ((IT) == DMA1_IT_TE4) || \
((IT) == DMA1_IT_GL5) || ((IT) == DMA1_IT_TC5) || \
((IT) == DMA1_IT_HT5) || ((IT) == DMA1_IT_TE5))
/**
* @}
*/
/** @defgroup DMA_flags_definition
* @{
*/
#define DMA1_FLAG_GL1 DMA_ISR_GIF1
#define DMA1_FLAG_TC1 DMA_ISR_TCIF1
#define DMA1_FLAG_HT1 DMA_ISR_HTIF1
#define DMA1_FLAG_TE1 DMA_ISR_TEIF1
#define DMA1_FLAG_GL2 DMA_ISR_GIF2
#define DMA1_FLAG_TC2 DMA_ISR_TCIF2
#define DMA1_FLAG_HT2 DMA_ISR_HTIF2
#define DMA1_FLAG_TE2 DMA_ISR_TEIF2
#define DMA1_FLAG_GL3 DMA_ISR_GIF3
#define DMA1_FLAG_TC3 DMA_ISR_TCIF3
#define DMA1_FLAG_HT3 DMA_ISR_HTIF3
#define DMA1_FLAG_TE3 DMA_ISR_TEIF3
#define DMA1_FLAG_GL4 DMA_ISR_GIF4
#define DMA1_FLAG_TC4 DMA_ISR_TCIF4
#define DMA1_FLAG_HT4 DMA_ISR_HTIF4
#define DMA1_FLAG_TE4 DMA_ISR_TEIF4
#define DMA1_FLAG_GL5 DMA_ISR_GIF5
#define DMA1_FLAG_TC5 DMA_ISR_TCIF5
#define DMA1_FLAG_HT5 DMA_ISR_HTIF5
#define DMA1_FLAG_TE5 DMA_ISR_TEIF5
#define IS_DMA_CLEAR_FLAG(FLAG) ((((FLAG) & 0xFFF00000) == 0x00) && ((FLAG) != 0x00))
#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA1_FLAG_GL1) || ((FLAG) == DMA1_FLAG_TC1) || \
((FLAG) == DMA1_FLAG_HT1) || ((FLAG) == DMA1_FLAG_TE1) || \
((FLAG) == DMA1_FLAG_GL2) || ((FLAG) == DMA1_FLAG_TC2) || \
((FLAG) == DMA1_FLAG_HT2) || ((FLAG) == DMA1_FLAG_TE2) || \
((FLAG) == DMA1_FLAG_GL3) || ((FLAG) == DMA1_FLAG_TC3) || \
((FLAG) == DMA1_FLAG_HT3) || ((FLAG) == DMA1_FLAG_TE3) || \
((FLAG) == DMA1_FLAG_GL4) || ((FLAG) == DMA1_FLAG_TC4) || \
((FLAG) == DMA1_FLAG_HT4) || ((FLAG) == DMA1_FLAG_TE4) || \
((FLAG) == DMA1_FLAG_GL5) || ((FLAG) == DMA1_FLAG_TC5) || \
((FLAG) == DMA1_FLAG_HT5) || ((FLAG) == DMA1_FLAG_TE5))
/**
* @}
*/
/** @defgroup DMA_Buffer_Size
* @{
*/
#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the DMA configuration to the default reset state ******/
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
/* Initialization and Configuration functions *********************************/
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
/* Data Counter functions******************************************************/
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
/* Interrupts and flags management functions **********************************/
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG);
void DMA_ClearFlag(uint32_t DMA_FLAG);
ITStatus DMA_GetITStatus(uint32_t DMA_IT);
void DMA_ClearITPendingBit(uint32_t DMA_IT);
#ifdef __cplusplus
}
#endif
#endif /*__STM32F0XX_DMA_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,194 @@
/**
******************************************************************************
* @file stm32f0xx_exti.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the EXTI
* firmware library
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_EXTI_H
#define __STM32F0XX_EXTI_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup EXTI
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief EXTI mode enumeration
*/
typedef enum
{
EXTI_Mode_Interrupt = 0x00,
EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;
#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event))
/**
* @brief EXTI Trigger enumeration
*/
typedef enum
{
EXTI_Trigger_Rising = 0x08,
EXTI_Trigger_Falling = 0x0C,
EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;
#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \
((TRIGGER) == EXTI_Trigger_Falling) || \
((TRIGGER) == EXTI_Trigger_Rising_Falling))
/**
* @brief EXTI Init Structure definition
*/
typedef struct
{
uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled.
This parameter can be any combination of @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines.
This parameter can be set either to ENABLE or DISABLE */
}EXTI_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup EXTI_Exported_Constants
* @{
*/
/** @defgroup EXTI_Lines
* @{
*/
#define EXTI_Line0 ((uint32_t)0x00000001) /*!< External interrupt line 0 */
#define EXTI_Line1 ((uint32_t)0x00000002) /*!< External interrupt line 1 */
#define EXTI_Line2 ((uint32_t)0x00000004) /*!< External interrupt line 2 */
#define EXTI_Line3 ((uint32_t)0x00000008) /*!< External interrupt line 3 */
#define EXTI_Line4 ((uint32_t)0x00000010) /*!< External interrupt line 4 */
#define EXTI_Line5 ((uint32_t)0x00000020) /*!< External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00000040) /*!< External interrupt line 6 */
#define EXTI_Line7 ((uint32_t)0x00000080) /*!< External interrupt line 7 */
#define EXTI_Line8 ((uint32_t)0x00000100) /*!< External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00000200) /*!< External interrupt line 9 */
#define EXTI_Line10 ((uint32_t)0x00000400) /*!< External interrupt line 10 */
#define EXTI_Line11 ((uint32_t)0x00000800) /*!< External interrupt line 11 */
#define EXTI_Line12 ((uint32_t)0x00001000) /*!< External interrupt line 12 */
#define EXTI_Line13 ((uint32_t)0x00002000) /*!< External interrupt line 13 */
#define EXTI_Line14 ((uint32_t)0x00004000) /*!< External interrupt line 14 */
#define EXTI_Line15 ((uint32_t)0x00008000) /*!< External interrupt line 15 */
#define EXTI_Line16 ((uint32_t)0x00010000) /*!< External interrupt line 16
Connected to the PVD Output */
#define EXTI_Line17 ((uint32_t)0x00020000) /*!< Internal interrupt line 17
Connected to the RTC Alarm
event */
#define EXTI_Line19 ((uint32_t)0x00080000) /*!< Internal interrupt line 19
Connected to the RTC Tamper
and Time Stamp events */
#define EXTI_Line21 ((uint32_t)0x00200000) /*!< Internal interrupt line 21
Connected to the Comparator 1
event */
#define EXTI_Line22 ((uint32_t)0x00400000) /*!< Internal interrupt line 22
Connected to the Comparator 2
event */
#define EXTI_Line23 ((uint32_t)0x00800000) /*!< Internal interrupt line 23
Connected to the I2C1 wakeup
event */
#define EXTI_Line25 ((uint32_t)0x02000000) /*!< Internal interrupt line 25
Connected to the USART1 wakeup
event */
#define EXTI_Line27 ((uint32_t)0x08000000) /*!< Internal interrupt line 27
Connected to the CEC wakeup
event */
#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xF5140000) == 0x00) && ((LINE) != (uint16_t)0x00))
#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \
((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \
((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \
((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \
((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \
((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \
((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \
((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \
((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \
((LINE) == EXTI_Line19) || ((LINE) == EXTI_Line21) || \
((LINE) == EXTI_Line22))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the EXTI configuration to the default reset state *****/
void EXTI_DeInit(void);
/* Initialization and Configuration functions *********************************/
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
/* Interrupts and flags management functions **********************************/
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_EXTI_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,320 @@
/**
******************************************************************************
* @file stm32f0xx_flash.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the FLASH
* firmware library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_FLASH_H
#define __STM32F0XX_FLASH_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup FLASH
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief FLASH Status
*/
typedef enum
{
FLASH_BUSY = 1,
FLASH_ERROR_WRP,
FLASH_ERROR_PROGRAM,
FLASH_COMPLETE,
FLASH_TIMEOUT
}FLASH_Status;
/* Exported constants --------------------------------------------------------*/
/** @defgroup FLASH_Exported_Constants
* @{
*/
/** @defgroup FLASH_Latency
* @{
*/
#define FLASH_Latency_0 ((uint32_t)0x00000000) /*!< FLASH Zero Latency cycle */
#define FLASH_Latency_1 FLASH_ACR_LATENCY /*!< FLASH One Latency cycle */
#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \
((LATENCY) == FLASH_Latency_1))
/**
* @}
*/
/** @defgroup FLASH_Interrupts
* @{
*/
#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of programming interrupt source */
#define FLASH_IT_ERR FLASH_CR_ERRIE /*!< Error interrupt source */
#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFFEBFF) == 0x00000000) && (((IT) != 0x00000000)))
/**
* @}
*/
/** @defgroup FLASH_Address
* @{
*/
#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) <= 0x0800FFFF))
/**
* @}
*/
/** @defgroup FLASH_OB_DATA_ADDRESS
* @{
*/
#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == 0x1FFFF804) || ((ADDRESS) == 0x1FFFF806))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_Write_Protection
* @{
*/
#define OB_WRP_Pages0to3 ((uint32_t)0x00000001) /* Write protection of page 0 to 3 */
#define OB_WRP_Pages4to7 ((uint32_t)0x00000002) /* Write protection of page 4 to 7 */
#define OB_WRP_Pages8to11 ((uint32_t)0x00000004) /* Write protection of page 8 to 11 */
#define OB_WRP_Pages12to15 ((uint32_t)0x00000008) /* Write protection of page 12 to 15 */
#define OB_WRP_Pages16to19 ((uint32_t)0x00000010) /* Write protection of page 16 to 19 */
#define OB_WRP_Pages20to23 ((uint32_t)0x00000020) /* Write protection of page 20 to 23 */
#define OB_WRP_Pages24to27 ((uint32_t)0x00000040) /* Write protection of page 24 to 27 */
#define OB_WRP_Pages28to31 ((uint32_t)0x00000080) /* Write protection of page 28 to 31 */
#define OB_WRP_Pages32to35 ((uint32_t)0x00000100) /* Write protection of page 32 to 35 */
#define OB_WRP_Pages36to39 ((uint32_t)0x00000200) /* Write protection of page 36 to 39 */
#define OB_WRP_Pages40to43 ((uint32_t)0x00000400) /* Write protection of page 40 to 43 */
#define OB_WRP_Pages44to47 ((uint32_t)0x00000800) /* Write protection of page 44 to 47 */
#define OB_WRP_Pages48to51 ((uint32_t)0x00001000) /* Write protection of page 48 to 51 */
#define OB_WRP_Pages52to55 ((uint32_t)0x00002000) /* Write protection of page 52 to 55 */
#define OB_WRP_Pages56to59 ((uint32_t)0x00004000) /* Write protection of page 56 to 59 */
#define OB_WRP_Pages60to63 ((uint32_t)0x00008000) /* Write protection of page 60 to 63 */
#define OB_WRP_AllPages ((uint32_t)0x0000FFFF) /*!< Write protection of all Sectors */
#define IS_OB_WRP(PAGE) (((PAGE) != 0x0000000))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_Read_Protection
* @{
*/
/**
* @brief FLASH_Read Protection Level
*/
#define OB_RDP_Level_0 ((uint8_t)0xAA)
#define OB_RDP_Level_1 ((uint8_t)0xBB)
/*#define OB_RDP_Level_2 ((uint8_t)0xCC)*/ /* Warning: When enabling read protection level 2
it's no more possible to go back to level 1 or 0 */
#define IS_OB_RDP(LEVEL) (((LEVEL) == OB_RDP_Level_0)||\
((LEVEL) == OB_RDP_Level_1))/*||\
((LEVEL) == OB_RDP_Level_2))*/
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_IWatchdog
* @{
*/
#define OB_IWDG_SW ((uint8_t)0x01) /*!< Software IWDG selected */
#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */
#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_nRST_STOP
* @{
*/
#define OB_STOP_NoRST ((uint8_t)0x02) /*!< No reset generated when entering in STOP */
#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */
#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_nRST_STDBY
* @{
*/
#define OB_STDBY_NoRST ((uint8_t)0x04) /*!< No reset generated when entering in STANDBY */
#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */
#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_BOOT1
* @{
*/
#define OB_BOOT1_RESET ((uint8_t)0x00) /*!< BOOT1 Reset */
#define OB_BOOT1_SET ((uint8_t)0x10) /*!< BOOT1 Set */
#define IS_OB_BOOT1(BOOT1) (((BOOT1) == OB_BOOT1_RESET) || ((BOOT1) == OB_BOOT1_SET))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_VDDA_Analog_Monitoring
* @{
*/
#define OB_VDDA_ANALOG_ON ((uint8_t)0x00) /*!< Analog monitoring on VDDA Power source ON */
#define OB_VDDA_ANALOG_OFF ((uint8_t)0x20) /*!< Analog monitoring on VDDA Power source OFF */
#define IS_OB_VDDA_ANALOG(ANALOG) (((ANALOG) == OB_VDDA_ANALOG_ON) || ((ANALOG) == OB_VDDA_ANALOG_OFF))
/**
* @}
*/
/** @defgroup FLASH_Option_Bytes_SRAM_Parity_Enable
* @{
*/
#define OB_SRAM_PARITY_SET ((uint8_t)0x00) /*!< SRAM parity enable Set */
#define OB_SRAM_PARITY_RESET ((uint8_t)0x40) /*!< SRAM parity enable reset */
#define IS_OB_SRAM_PARITY(PARITY) (((PARITY) == OB_SRAM_PARITY_SET) || ((PARITY) == OB_SRAM_PARITY_RESET))
/**
* @}
*/
/** @defgroup FLASH_Flags
* @{
*/
#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */
#define FLASH_FLAG_PGERR FLASH_SR_PGERR /*!< FLASH Programming error flag */
#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */
#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Programming flag */
#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFC3) == 0x00000000) && ((FLAG) != 0x00000000))
#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_PGERR) || \
((FLAG) == FLASH_FLAG_WRPERR) || ((FLAG) == FLASH_FLAG_EOP))
/**
* @}
*/
/** @defgroup FLASH_Timeout_definition
* @{
*/
#define FLASH_ER_PRG_TIMEOUT ((uint32_t)0x000B0000)
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/**
* @brief FLASH memory functions that can be executed from FLASH.
*/
/* FLASH Interface configuration functions ************************************/
void FLASH_SetLatency(uint32_t FLASH_Latency);
void FLASH_PrefetchBufferCmd(FunctionalState NewState);
FlagStatus FLASH_GetPrefetchBufferStatus(void);
/* FLASH Memory Programming functions *****************************************/
void FLASH_Unlock(void);
void FLASH_Lock(void);
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
FLASH_Status FLASH_EraseAllPages(void);
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
/* FLASH Option Bytes Programming functions *****************************************/
void FLASH_OB_Unlock(void);
void FLASH_OB_Lock(void);
void FLASH_OB_Launch(void);
FLASH_Status FLASH_OB_Erase(void);
FLASH_Status FLASH_OB_EnableWRP(uint32_t OB_WRP);
FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP);
FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY);
FLASH_Status FLASH_OB_BOOTConfig(uint8_t OB_BOOT1);
FLASH_Status FLASH_OB_VDDAConfig(uint8_t OB_VDDA_ANALOG);
FLASH_Status FLASH_OB_SRAMParityConfig(uint8_t OB_SRAM_Parity);
FLASH_Status FLASH_OB_WriteUser(uint8_t OB_USER);
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
uint8_t FLASH_OB_GetUser(void);
uint32_t FLASH_OB_GetWRP(void);
FlagStatus FLASH_OB_GetRDP(void);
/* FLASH Interrupts and flags management functions **********************************/
void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState);
FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG);
void FLASH_ClearFlag(uint32_t FLASH_FLAG);
FLASH_Status FLASH_GetStatus(void);
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_FLASH_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,350 @@
/**
******************************************************************************
* @file stm32f0xx_gpio.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the GPIO
* firmware library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_GPIO_H
#define __STM32F0XX_GPIO_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup GPIO
* @{
*/
/* Exported types ------------------------------------------------------------*/
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOF))
#define IS_GPIO_LIST_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB))
/** @defgroup Configuration_Mode_enumeration
* @{
*/
typedef enum
{
GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */
GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */
GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */
GPIO_Mode_AN = 0x03 /*!< GPIO Analog In/Out Mode */
}GPIOMode_TypeDef;
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN)|| ((MODE) == GPIO_Mode_OUT) || \
((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN))
/**
* @}
*/
/** @defgroup Output_type_enumeration
* @{
*/
typedef enum
{
GPIO_OType_PP = 0x00,
GPIO_OType_OD = 0x01
}GPIOOType_TypeDef;
#define IS_GPIO_OTYPE(OTYPE) (((OTYPE) == GPIO_OType_PP) || ((OTYPE) == GPIO_OType_OD))
/**
* @}
*/
/** @defgroup Output_Maximum_frequency_enumeration
* @{
*/
typedef enum
{
GPIO_Speed_Level_1 = 0x01, /*!< Medium Speed */
GPIO_Speed_Level_2 = 0x02, /*!< Fast Speed */
GPIO_Speed_Level_3 = 0x03 /*!< High Speed */
}GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_Level_1) || ((SPEED) == GPIO_Speed_Level_2) || \
((SPEED) == GPIO_Speed_Level_3))
/**
* @}
*/
/** @defgroup Configuration_Pull-Up_Pull-Down_enumeration
* @{
*/
typedef enum
{
GPIO_PuPd_NOPULL = 0x00,
GPIO_PuPd_UP = 0x01,
GPIO_PuPd_DOWN = 0x02
}GPIOPuPd_TypeDef;
#define IS_GPIO_PUPD(PUPD) (((PUPD) == GPIO_PuPd_NOPULL) || ((PUPD) == GPIO_PuPd_UP) || \
((PUPD) == GPIO_PuPd_DOWN))
/**
* @}
*/
/** @defgroup Bit_SET_and_Bit_RESET_enumeration
* @{
*/
typedef enum
{
Bit_RESET = 0,
Bit_SET
}BitAction;
#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET))
/**
* @}
*/
/**
* @brief GPIO Init structure definition
*/
typedef struct
{
uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins.
This parameter can be a value of @ref GPIOOType_TypeDef */
GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins.
This parameter can be a value of @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup GPIO_Exported_Constants
* @{
*/
/** @defgroup GPIO_pins_define
* @{
*/
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */
#define IS_GPIO_PIN(PIN) ((PIN) != (uint16_t)0x00)
#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \
((PIN) == GPIO_Pin_1) || \
((PIN) == GPIO_Pin_2) || \
((PIN) == GPIO_Pin_3) || \
((PIN) == GPIO_Pin_4) || \
((PIN) == GPIO_Pin_5) || \
((PIN) == GPIO_Pin_6) || \
((PIN) == GPIO_Pin_7) || \
((PIN) == GPIO_Pin_8) || \
((PIN) == GPIO_Pin_9) || \
((PIN) == GPIO_Pin_10) || \
((PIN) == GPIO_Pin_11) || \
((PIN) == GPIO_Pin_12) || \
((PIN) == GPIO_Pin_13) || \
((PIN) == GPIO_Pin_14) || \
((PIN) == GPIO_Pin_15))
/**
* @}
*/
/** @defgroup GPIO_Pin_sources
* @{
*/
#define GPIO_PinSource0 ((uint8_t)0x00)
#define GPIO_PinSource1 ((uint8_t)0x01)
#define GPIO_PinSource2 ((uint8_t)0x02)
#define GPIO_PinSource3 ((uint8_t)0x03)
#define GPIO_PinSource4 ((uint8_t)0x04)
#define GPIO_PinSource5 ((uint8_t)0x05)
#define GPIO_PinSource6 ((uint8_t)0x06)
#define GPIO_PinSource7 ((uint8_t)0x07)
#define GPIO_PinSource8 ((uint8_t)0x08)
#define GPIO_PinSource9 ((uint8_t)0x09)
#define GPIO_PinSource10 ((uint8_t)0x0A)
#define GPIO_PinSource11 ((uint8_t)0x0B)
#define GPIO_PinSource12 ((uint8_t)0x0C)
#define GPIO_PinSource13 ((uint8_t)0x0D)
#define GPIO_PinSource14 ((uint8_t)0x0E)
#define GPIO_PinSource15 ((uint8_t)0x0F)
#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \
((PINSOURCE) == GPIO_PinSource1) || \
((PINSOURCE) == GPIO_PinSource2) || \
((PINSOURCE) == GPIO_PinSource3) || \
((PINSOURCE) == GPIO_PinSource4) || \
((PINSOURCE) == GPIO_PinSource5) || \
((PINSOURCE) == GPIO_PinSource6) || \
((PINSOURCE) == GPIO_PinSource7) || \
((PINSOURCE) == GPIO_PinSource8) || \
((PINSOURCE) == GPIO_PinSource9) || \
((PINSOURCE) == GPIO_PinSource10) || \
((PINSOURCE) == GPIO_PinSource11) || \
((PINSOURCE) == GPIO_PinSource12) || \
((PINSOURCE) == GPIO_PinSource13) || \
((PINSOURCE) == GPIO_PinSource14) || \
((PINSOURCE) == GPIO_PinSource15))
/**
* @}
*/
/** @defgroup GPIO_Alternate_function_selection_define
* @{
*/
/**
* @brief AF 0 selection
*/
#define GPIO_AF_0 ((uint8_t)0x00) /* WKUP, EVENTOUT, TIM15, SPI1, TIM17,
MCO, SWDAT, SWCLK, TIM14, BOOT,
USART1, CEC, IR_OUT, SPI2 */
/**
* @brief AF 1 selection
*/
#define GPIO_AF_1 ((uint8_t)0x01) /* USART2, CEC, Tim3, USART1, USART2,
EVENTOUT, I2C1, I2C2, TIM15 */
/**
* @brief AF 2 selection
*/
#define GPIO_AF_2 ((uint8_t)0x02) /* TIM2, TIM1, EVENTOUT, TIM16, TIM17 */
/**
* @brief AF 3 selection
*/
#define GPIO_AF_3 ((uint8_t)0x03) /* TS, I2C1, TIM15, EVENTOUT */
/**
* @brief AF 4 selection
*/
#define GPIO_AF_4 ((uint8_t)0x04) /* TIM14 */
/**
* @brief AF 5 selection
*/
#define GPIO_AF_5 ((uint8_t)0x05) /* TIM16, TIM17 */
/**
* @brief AF 6 selection
*/
#define GPIO_AF_6 ((uint8_t)0x06) /* EVENTOUT */
/**
* @brief AF 7 selection
*/
#define GPIO_AF_7 ((uint8_t)0x07) /* COMP1 OUT and COMP2 OUT */
#define IS_GPIO_AF(AF) (((AF) == GPIO_AF_0) || ((AF) == GPIO_AF_1) || \
((AF) == GPIO_AF_2) || ((AF) == GPIO_AF_3) || \
((AF) == GPIO_AF_4) || ((AF) == GPIO_AF_5) || \
((AF) == GPIO_AF_6) || ((AF) == GPIO_AF_7))
/**
* @}
*/
/** @defgroup GPIO_Speed_Legacy
* @{
*/
#define GPIO_Speed_10MHz GPIO_Speed_Level_1 /*!< Fast Speed:10MHz */
#define GPIO_Speed_2MHz GPIO_Speed_Level_2 /*!< Medium Speed:2MHz */
#define GPIO_Speed_50MHz GPIO_Speed_Level_3 /*!< High Speed:50MHz */
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the GPIO configuration to the default reset state *****/
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
/* Initialization and Configuration functions *********************************/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
/* GPIO Alternate functions configuration functions ***************************/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_GPIO_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,478 @@
/**
******************************************************************************
* @file stm32f0xx_i2c.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the I2C firmware
* library
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_I2C_H
#define __STM32F0XX_I2C_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup I2C
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief I2C Init structure definition
*/
typedef struct
{
uint32_t I2C_Timing; /*!< Specifies the I2C_TIMINGR_register value.
This parameter must be set by referring to I2C_Timing_Config_Tool*/
uint32_t I2C_AnalogFilter; /*!< Enables or disables analog noise filter.
This parameter can be a value of @ref I2C_Analog_Filter*/
uint32_t I2C_DigitalFilter; /*!< Configures the digital noise filter.
This parameter can be a number between 0x00 and 0x0F*/
uint32_t I2C_Mode; /*!< Specifies the I2C mode.
This parameter can be a value of @ref I2C_mode*/
uint32_t I2C_OwnAddress1; /*!< Specifies the device own address 1.
This parameter can be a 7-bit or 10-bit address*/
uint32_t I2C_Ack; /*!< Enables or disables the acknowledgement.
This parameter can be a value of @ref I2C_acknowledgement*/
uint32_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged.
This parameter can be a value of @ref I2C_acknowledged_address*/
}I2C_InitTypeDef;
/* Exported constants --------------------------------------------------------*/
/** @defgroup I2C_Exported_Constants
* @{
*/
#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \
((PERIPH) == I2C2))
#define IS_I2C_1_PERIPH(PERIPH) ((PERIPH) == I2C1)
/** @defgroup I2C_Analog_Filter
* @{
*/
#define I2C_AnalogFilter_Enable ((uint32_t)0x00000000)
#define I2C_AnalogFilter_Disable I2C_CR1_ANFOFF
#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_AnalogFilter_Enable) || \
((FILTER) == I2C_AnalogFilter_Disable))
/**
* @}
*/
/** @defgroup I2C_Digital_Filter
* @{
*/
#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000F)
/**
* @}
*/
/** @defgroup I2C_mode
* @{
*/
#define I2C_Mode_I2C ((uint32_t)0x00000000)
#define I2C_Mode_SMBusDevice I2C_CR1_SMBDEN
#define I2C_Mode_SMBusHost I2C_CR1_SMBHEN
#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \
((MODE) == I2C_Mode_SMBusDevice) || \
((MODE) == I2C_Mode_SMBusHost))
/**
* @}
*/
/** @defgroup I2C_acknowledgement
* @{
*/
#define I2C_Ack_Enable ((uint32_t)0x00000000)
#define I2C_Ack_Disable I2C_CR2_NACK
#define IS_I2C_ACK(ACK) (((ACK) == I2C_Ack_Enable) || \
((ACK) == I2C_Ack_Disable))
/**
* @}
*/
/** @defgroup I2C_acknowledged_address
* @{
*/
#define I2C_AcknowledgedAddress_7bit ((uint32_t)0x00000000)
#define I2C_AcknowledgedAddress_10bit I2C_OAR1_OA1MODE
#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \
((ADDRESS) == I2C_AcknowledgedAddress_10bit))
/**
* @}
*/
/** @defgroup I2C_own_address1
* @{
*/
#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= (uint32_t)0x000003FF)
/**
* @}
*/
/** @defgroup I2C_transfer_direction
* @{
*/
#define I2C_Direction_Transmitter ((uint16_t)0x0000)
#define I2C_Direction_Receiver ((uint16_t)0x0400)
#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \
((DIRECTION) == I2C_Direction_Receiver))
/**
* @}
*/
/** @defgroup I2C_DMA_transfer_requests
* @{
*/
#define I2C_DMAReq_Tx I2C_CR1_TXDMAEN
#define I2C_DMAReq_Rx I2C_CR1_RXDMAEN
#define IS_I2C_DMA_REQ(REQ) ((((REQ) & (uint32_t)0xFFFF3FFF) == 0x00) && ((REQ) != 0x00))
/**
* @}
*/
/** @defgroup I2C_slave_address
* @{
*/
#define IS_I2C_SLAVE_ADDRESS(ADDRESS) ((ADDRESS) <= (uint16_t)0x03FF)
/**
* @}
*/
/** @defgroup I2C_own_address2
* @{
*/
#define IS_I2C_OWN_ADDRESS2(ADDRESS2) ((ADDRESS2) <= (uint16_t)0x00FF)
/**
* @}
*/
/** @defgroup I2C_own_address2_mask
* @{
*/
#define I2C_OA2_NoMask ((uint8_t)0x00)
#define I2C_OA2_Mask01 ((uint8_t)0x01)
#define I2C_OA2_Mask02 ((uint8_t)0x02)
#define I2C_OA2_Mask03 ((uint8_t)0x03)
#define I2C_OA2_Mask04 ((uint8_t)0x04)
#define I2C_OA2_Mask05 ((uint8_t)0x05)
#define I2C_OA2_Mask06 ((uint8_t)0x06)
#define I2C_OA2_Mask07 ((uint8_t)0x07)
#define IS_I2C_OWN_ADDRESS2_MASK(MASK) (((MASK) == I2C_OA2_NoMask) || \
((MASK) == I2C_OA2_Mask01) || \
((MASK) == I2C_OA2_Mask02) || \
((MASK) == I2C_OA2_Mask03) || \
((MASK) == I2C_OA2_Mask04) || \
((MASK) == I2C_OA2_Mask05) || \
((MASK) == I2C_OA2_Mask06) || \
((MASK) == I2C_OA2_Mask07))
/**
* @}
*/
/** @defgroup I2C_timeout
* @{
*/
#define IS_I2C_TIMEOUT(TIMEOUT) ((TIMEOUT) <= (uint16_t)0x0FFF)
/**
* @}
*/
/** @defgroup I2C_registers
* @{
*/
#define I2C_Register_CR1 ((uint8_t)0x00)
#define I2C_Register_CR2 ((uint8_t)0x04)
#define I2C_Register_OAR1 ((uint8_t)0x08)
#define I2C_Register_OAR2 ((uint8_t)0x0C)
#define I2C_Register_TIMINGR ((uint8_t)0x10)
#define I2C_Register_TIMEOUTR ((uint8_t)0x14)
#define I2C_Register_ISR ((uint8_t)0x18)
#define I2C_Register_ICR ((uint8_t)0x1C)
#define I2C_Register_PECR ((uint8_t)0x20)
#define I2C_Register_RXDR ((uint8_t)0x24)
#define I2C_Register_TXDR ((uint8_t)0x28)
#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \
((REGISTER) == I2C_Register_CR2) || \
((REGISTER) == I2C_Register_OAR1) || \
((REGISTER) == I2C_Register_OAR2) || \
((REGISTER) == I2C_Register_TIMINGR) || \
((REGISTER) == I2C_Register_TIMEOUTR) || \
((REGISTER) == I2C_Register_ISR) || \
((REGISTER) == I2C_Register_ICR) || \
((REGISTER) == I2C_Register_PECR) || \
((REGISTER) == I2C_Register_RXDR) || \
((REGISTER) == I2C_Register_TXDR))
/**
* @}
*/
/** @defgroup I2C_interrupts_definition
* @{
*/
#define I2C_IT_ERRI I2C_CR1_ERRIE
#define I2C_IT_TCI I2C_CR1_TCIE
#define I2C_IT_STOPI I2C_CR1_STOPIE
#define I2C_IT_NACKI I2C_CR1_NACKIE
#define I2C_IT_ADDRI I2C_CR1_ADDRIE
#define I2C_IT_RXI I2C_CR1_RXIE
#define I2C_IT_TXI I2C_CR1_TXIE
#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint32_t)0xFFFFFF01) == 0x00) && ((IT) != 0x00))
/**
* @}
*/
/** @defgroup I2C_flags_definition
* @{
*/
#define I2C_FLAG_TXE I2C_ISR_TXE
#define I2C_FLAG_TXIS I2C_ISR_TXIS
#define I2C_FLAG_RXNE I2C_ISR_RXNE
#define I2C_FLAG_ADDR I2C_ISR_ADDR
#define I2C_FLAG_NACKF I2C_ISR_NACKF
#define I2C_FLAG_STOPF I2C_ISR_STOPF
#define I2C_FLAG_TC I2C_ISR_TC
#define I2C_FLAG_TCR I2C_ISR_TCR
#define I2C_FLAG_BERR I2C_ISR_BERR
#define I2C_FLAG_ARLO I2C_ISR_ARLO
#define I2C_FLAG_OVR I2C_ISR_OVR
#define I2C_FLAG_PECERR I2C_ISR_PECERR
#define I2C_FLAG_TIMEOUT I2C_ISR_TIMEOUT
#define I2C_FLAG_ALERT I2C_ISR_ALERT
#define I2C_FLAG_BUSY I2C_ISR_BUSY
#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFF4000) == 0x00) && ((FLAG) != 0x00))
#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_TXIS) || \
((FLAG) == I2C_FLAG_RXNE) || ((FLAG) == I2C_FLAG_ADDR) || \
((FLAG) == I2C_FLAG_NACKF) || ((FLAG) == I2C_FLAG_STOPF) || \
((FLAG) == I2C_FLAG_TC) || ((FLAG) == I2C_FLAG_TCR) || \
((FLAG) == I2C_FLAG_BERR) || ((FLAG) == I2C_FLAG_ARLO) || \
((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_PECERR) || \
((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_ALERT) || \
((FLAG) == I2C_FLAG_BUSY))
/**
* @}
*/
/** @defgroup I2C_interrupts_definition
* @{
*/
#define I2C_IT_TXIS I2C_ISR_TXIS
#define I2C_IT_RXNE I2C_ISR_RXNE
#define I2C_IT_ADDR I2C_ISR_ADDR
#define I2C_IT_NACKF I2C_ISR_NACKF
#define I2C_IT_STOPF I2C_ISR_STOPF
#define I2C_IT_TC I2C_ISR_TC
#define I2C_IT_TCR I2C_ISR_TCR
#define I2C_IT_BERR I2C_ISR_BERR
#define I2C_IT_ARLO I2C_ISR_ARLO
#define I2C_IT_OVR I2C_ISR_OVR
#define I2C_IT_PECERR I2C_ISR_PECERR
#define I2C_IT_TIMEOUT I2C_ISR_TIMEOUT
#define I2C_IT_ALERT I2C_ISR_ALERT
#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFFFFC001) == 0x00) && ((IT) != 0x00))
#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_TXIS) || ((IT) == I2C_IT_RXNE) || \
((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_NACKF) || \
((IT) == I2C_IT_STOPF) || ((IT) == I2C_IT_TC) || \
((IT) == I2C_IT_TCR) || ((IT) == I2C_IT_BERR) || \
((IT) == I2C_IT_ARLO) || ((IT) == I2C_IT_OVR) || \
((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_TIMEOUT) || \
((IT) == I2C_IT_ALERT))
/**
* @}
*/
/** @defgroup I2C_ReloadEndMode_definition
* @{
*/
#define I2C_Reload_Mode I2C_CR2_RELOAD
#define I2C_AutoEnd_Mode I2C_CR2_AUTOEND
#define I2C_SoftEnd_Mode ((uint32_t)0x00000000)
#define IS_RELOAD_END_MODE(MODE) (((MODE) == I2C_Reload_Mode) || \
((MODE) == I2C_AutoEnd_Mode) || \
((MODE) == I2C_SoftEnd_Mode))
/**
* @}
*/
/** @defgroup I2C_StartStopMode_definition
* @{
*/
#define I2C_No_StartStop ((uint32_t)0x00000000)
#define I2C_Generate_Stop I2C_CR2_STOP
#define I2C_Generate_Start_Read (uint32_t)(I2C_CR2_START | I2C_CR2_RD_WRN)
#define I2C_Generate_Start_Write I2C_CR2_START
#define IS_START_STOP_MODE(MODE) (((MODE) == I2C_Generate_Stop) || \
((MODE) == I2C_Generate_Start_Read) || \
((MODE) == I2C_Generate_Start_Write) || \
((MODE) == I2C_No_StartStop))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Initialization and Configuration functions *********************************/
void I2C_DeInit(I2C_TypeDef* I2Cx);
void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);
void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);
void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_ITConfig(I2C_TypeDef* I2Cx, uint32_t I2C_IT, FunctionalState NewState);
void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_StopModeCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Mask);
void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_SlaveByteControlCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_SlaveAddressConfig(I2C_TypeDef* I2Cx, uint16_t Address);
void I2C_10BitAddressingModeCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
/* Communications handling functions ******************************************/
void I2C_AutoEndCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_ReloadCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_NumberOfBytesConfig(I2C_TypeDef* I2Cx, uint8_t Number_Bytes);
void I2C_MasterRequestConfig(I2C_TypeDef* I2Cx, uint16_t I2C_Direction);
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_10BitAddressHeaderCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);
uint8_t I2C_GetAddressMatched(I2C_TypeDef* I2Cx);
uint16_t I2C_GetTransferDirection(I2C_TypeDef* I2Cx);
void I2C_TransferHandling(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Number_Bytes, uint32_t ReloadEndMode, uint32_t StartStopMode);
/* SMBUS management functions ************************************************/
void I2C_SMBusAlertCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_ClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_ExtendedClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_IdleClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_TimeoutAConfig(I2C_TypeDef* I2Cx, uint16_t Timeout);
void I2C_TimeoutBConfig(I2C_TypeDef* I2Cx, uint16_t Timeout);
void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_PECRequestCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx);
/* I2C registers management functions *****************************************/
uint32_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register);
/* Data transfers management functions ****************************************/
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);
/* DMA transfers management functions *****************************************/
void I2C_DMACmd(I2C_TypeDef* I2Cx, uint32_t I2C_DMAReq, FunctionalState NewState);
/* Interrupts and flags management functions **********************************/
FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT);
void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT);
#ifdef __cplusplus
}
#endif
#endif /*__STM32F0XX_I2C_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,140 @@
/**
******************************************************************************
* @file stm32f0xx_iwdg.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the IWDG
* firmware library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_IWDG_H
#define __STM32F0XX_IWDG_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup IWDG
* @{
*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup IWDG_Exported_Constants
* @{
*/
/** @defgroup IWDG_WriteAccess
* @{
*/
#define IWDG_WriteAccess_Enable ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable ((uint16_t)0x0000)
#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \
((ACCESS) == IWDG_WriteAccess_Disable))
/**
* @}
*/
/** @defgroup IWDG_prescaler
* @{
*/
#define IWDG_Prescaler_4 ((uint8_t)0x00)
#define IWDG_Prescaler_8 ((uint8_t)0x01)
#define IWDG_Prescaler_16 ((uint8_t)0x02)
#define IWDG_Prescaler_32 ((uint8_t)0x03)
#define IWDG_Prescaler_64 ((uint8_t)0x04)
#define IWDG_Prescaler_128 ((uint8_t)0x05)
#define IWDG_Prescaler_256 ((uint8_t)0x06)
#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \
((PRESCALER) == IWDG_Prescaler_8) || \
((PRESCALER) == IWDG_Prescaler_16) || \
((PRESCALER) == IWDG_Prescaler_32) || \
((PRESCALER) == IWDG_Prescaler_64) || \
((PRESCALER) == IWDG_Prescaler_128)|| \
((PRESCALER) == IWDG_Prescaler_256))
/**
* @}
*/
/** @defgroup IWDG_Flag
* @{
*/
#define IWDG_FLAG_PVU IWDG_SR_PVU
#define IWDG_FLAG_RVU IWDG_SR_RVU
#define IWDG_FLAG_WVU IWDG_SR_WVU
#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU) || \
((FLAG) == IWDG_FLAG_WVU))
#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF)
#define IS_IWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0xFFF)
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Prescaler and Counter configuration functions ******************************/
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
void IWDG_SetReload(uint16_t Reload);
void IWDG_ReloadCounter(void);
void IWDG_SetWindowValue(uint16_t WindowValue);
/* IWDG activation function ***************************************************/
void IWDG_Enable(void);
/* Flag management function ***************************************************/
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_IWDG_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,143 @@
/**
******************************************************************************
* @file stm32f0xx_misc.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the miscellaneous
* firmware library functions (add-on to CMSIS functions).
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_MISC_H
#define __STM32F0XX_MISC_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup MISC
* @{
*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief NVIC Init Structure definition
*/
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled.
This parameter can be a value of @ref IRQn_Type
(For the complete STM32 Devices IRQ Channels list,
please refer to stm32f0xx.h file) */
uint8_t NVIC_IRQChannelPriority; /*!< Specifies the priority level for the IRQ channel specified
in NVIC_IRQChannel. This parameter can be a value
between 0 and 3. */
FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
will be enabled or disabled.
This parameter can be set either to ENABLE or DISABLE */
} NVIC_InitTypeDef;
/**
*
@verbatim
@endverbatim
*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup MISC_Exported_Constants
* @{
*/
/** @defgroup MISC_System_Low_Power
* @{
*/
#define NVIC_LP_SEVONPEND ((uint8_t)0x10)
#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04)
#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02)
#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \
((LP) == NVIC_LP_SLEEPDEEP) || \
((LP) == NVIC_LP_SLEEPONEXIT))
/**
* @}
*/
/** @defgroup MISC_Preemption_Priority_Group
* @{
*/
#define IS_NVIC_PRIORITY(PRIORITY) ((PRIORITY) < 0x04)
/**
* @}
*/
/** @defgroup MISC_SysTick_clock_source
* @{
*/
#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)
#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
((SOURCE) == SysTick_CLKSource_HCLK_Div8))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_MISC_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -0,0 +1,186 @@
/**
******************************************************************************
* @file stm32f0xx_pwr.h
* @author MCD Application Team
* @version V1.0.0
* @date 23-March-2012
* @brief This file contains all the functions prototypes for the PWR firmware
* library.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F0XX_PWR_H
#define __STM32F0XX_PWR_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0xx_StdPeriph_Driver
* @{
*/
/** @addtogroup PWR
* @{
*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup PWR_Exported_Constants
* @{
*/
/** @defgroup PWR_PVD_detection_level
* @{
*/
#define PWR_PVDLevel_0 PWR_CR_PLS_LEV0
#define PWR_PVDLevel_1 PWR_CR_PLS_LEV1
#define PWR_PVDLevel_2 PWR_CR_PLS_LEV2
#define PWR_PVDLevel_3 PWR_CR_PLS_LEV3
#define PWR_PVDLevel_4 PWR_CR_PLS_LEV4
#define PWR_PVDLevel_5 PWR_CR_PLS_LEV5
#define PWR_PVDLevel_6 PWR_CR_PLS_LEV6
#define PWR_PVDLevel_7 PWR_CR_PLS_LEV7
#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_0) || ((LEVEL) == PWR_PVDLevel_1)|| \
((LEVEL) == PWR_PVDLevel_2) || ((LEVEL) == PWR_PVDLevel_3)|| \
((LEVEL) == PWR_PVDLevel_4) || ((LEVEL) == PWR_PVDLevel_5)|| \
((LEVEL) == PWR_PVDLevel_6) || ((LEVEL) == PWR_PVDLevel_7))
/**
* @}
*/
/** @defgroup PWR_WakeUp_Pins
* @{
*/
#define PWR_WakeUpPin_1 PWR_CSR_EWUP1
#define PWR_WakeUpPin_2 PWR_CSR_EWUP2
#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WakeUpPin_1) || \
((PIN) == PWR_WakeUpPin_2))
/**
* @}
*/
/** @defgroup PWR_Regulator_state_is_Sleep_STOP_mode
* @{
*/
#define PWR_Regulator_ON ((uint32_t)0x00000000)
#define PWR_Regulator_LowPower PWR_CR_LPSDSR
#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \
((REGULATOR) == PWR_Regulator_LowPower))
/**
* @}
*/
/** @defgroup PWR_SLEEP_mode_entry
* @{
*/
#define PWR_SLEEPEntry_WFI ((uint8_t)0x01)
#define PWR_SLEEPEntry_WFE ((uint8_t)0x02)
#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPEntry_WFI) || ((ENTRY) == PWR_SLEEPEntry_WFE))
/**
* @}
*/
/** @defgroup PWR_STOP_mode_entry
* @{
*/
#define PWR_STOPEntry_WFI ((uint8_t)0x01)
#define PWR_STOPEntry_WFE ((uint8_t)0x02)
#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE))
/**
* @}
*/
/** @defgroup PWR_Flag
* @{
*/
#define PWR_FLAG_WU PWR_CSR_WUF
#define PWR_FLAG_SB PWR_CSR_SBF
#define PWR_FLAG_PVDO PWR_CSR_PVDO
#define PWR_FLAG_VREFINTRDY PWR_CSR_VREFINTRDYF
#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \
((FLAG) == PWR_FLAG_PVDO) || ((FLAG) == PWR_FLAG_VREFINTRDY))
#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB))
/**
* @}
*/
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the PWR configuration to the default reset state ******/
void PWR_DeInit(void);
/* Backup Domain Access function **********************************************/
void PWR_BackupAccessCmd(FunctionalState NewState);
/* PVD configuration functions ************************************************/
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel);
void PWR_PVDCmd(FunctionalState NewState);
/* WakeUp pins configuration functions ****************************************/
void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState);
/* Low Power modes configuration functions ************************************/
void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry);
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
void PWR_EnterSTANDBYMode(void);
/* Flags management functions *************************************************/
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);
void PWR_ClearFlag(uint32_t PWR_FLAG);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F0XX_PWR_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Some files were not shown because too many files have changed in this diff Show More