KindleEar (KindleEar)

八、九十年代人口流动让城市居民能够满足生活的基本所需的消费,人的聚集让零售业和服务业有了生存的土壤

添加于 2017年2月22日星期三 下午11:02:28 您在位置 #153-154的标注

“之所以一心想着死这件事,一定是因为活得太认真了。”

添加于 2017年3月3日星期五 下午10:39:45 您在位置 #1803-1803的标注

联接现实与未来的桥梁 2017-03-01 14:27 作者:陈赛来源:三联生活周刊 为什么?游戏到底提供了什么,是现实所无法提供的?或者说,游戏与现实到底是一种什么样的关系? 去年6月,芝加哥大学经济学院教授埃里克·赫斯特(Erik Hurst)在一次毕业演讲中提到了一项很有趣的统计: 与21世纪之初相比,美国20多岁的工人阶级的工作时间减少了4个小时,而玩游戏的时间增加了3个小时。在人口统计学的规模上,玩游戏取代了他们失去工作的时间。究其原因,这位教授认为,是现代技术,尤其是自动化技术减少了对“低水平技术”工作的需求,而越来越强大的游戏技术则提升了娱乐的主观价值。他表达了对于这些工人人生前景的担忧,包括经济不稳定、药物滥用、自杀倾向等。但是,与他们暗淡的未来形成鲜明对比的,是他们当下的幸福水平。就当下而言,这些年轻人并非悲惨绝望,而是恰恰相反。如果进行问卷调查,你会发现,这些人的幸福水平远远超过了2000年早期同类人群的幸福水平。也就是说,尽管就业率降低了,越来越多的年轻人住在父母的地下室里,但他们对生活的满足感却更高了。 但这场演讲中更令人信服的,是他谈到自己12岁的儿子玩游戏时。“现在他可以在周末写完作业以后玩两个小时的游戏,但如果由他来决定,我相信他每天会花23个小时半的时间玩游戏。如果没有我们的强令配给制度,我不知道他会不会不吃饭,但我很肯定他不会洗澡。” 据美国的一项最新统计:1.55亿美国人玩视频游戏,超过了美国总统竞选投票的人数。40%的美国人一周至少玩3小时游戏,3400万人每周平均玩22小时,500万人达到了每周40小时。美国年轻人在21岁以前平均花费1万小时在游戏中,与初高中教室中花费的时间一样。在短短三四十年的时间里,一种青少年亚文化的活动变成一种覆盖所有年龄、性别、种族的大众文化。 中国没有这样详细的数据,但2014年旧金山举办的一次游戏营销峰会上,第三方市场调研公司EEDAR公布了一组惊人的数据:中国玩家的总人数已经达到5.17亿人,其中28%的人每天游戏时间超过1小时,9.7%的人会为游戏花钱。 为什么?游戏到底提供了什么,是现实所无法提供的?或者说,游戏与现实到底是一种什么样的关系? 这是一个很重要的问题。在思考游戏与未来世界的关系之前,我们需要思考与现实之间当下的关系是什么?俄罗斯方块与现实世界是什么关系?象棋与现实世界是什么关系?篮球与现实世界有什么关系?《Minecraft》《街头霸王》《魔兽世界》,与现实世界又是什么关系? 一个显而易见的答案是,游戏是我们逃避现实的手段。 人在地球上的一生,实在被设置了太多的限制,你只被赋予一个身体、一种性别、一个种族、一个现实以及一小段的时间。所以,游戏与酒精、故事、魔法、艺术、摩天大楼、购物大厦、郊区、迪士尼主题乐园一样,归根结底都是我们作为一个有限的人,逃避自然与社会强加的种种限制与不确定性的努力。 美籍华人地理学家段义孚认为,逃避主义不仅是人类心智的一种自然机制,还是整个人类文明的驱动力。在《逃避主义》一书中,他总结了人类四种主要的逃避对象:自然、文化、混沌以及自身的动物性。 人类为了逃避自然的严酷无情,建立了城市,却又为城市的喧闹所禁锢,渴望回到自然。人类对于自身某些粗鲁的特征感到羞耻和厌恶,于是做出种种努力,要逃避这种本性,整容、遮羞都属于这种逃避。我们为了逃避心灵的蒙蔽与混沌,发明了科学,但是,当现代科学发展得如此纤细,如此丰富,将触角延伸到所有的角落,承诺揭开所有隐藏的神秘性时,我们又觉得,科学所创造的这个安全、有序的世界有一种令人难以忍受的沉闷气氛。于是,我们再次怀念起以往主宰我们命运的自然,期待冥冥之中某种神秘力量的介入,以及它所带来的夸张、戏剧性与命运感。就像一位小说家曾伤感地写到过的: “那过去的年代,那时候,大地腹中的宝石和九霄天的星星还关系到人的命运,不像今天,无论天上还是地下,一切都变得对这些凡夫俗子的命运漠不关心了。任何一颗尚未发现的星星不再关系凶吉,大量新的宝石被开采出来,全部测了大小,称了重量,验了密度,但它们不再向我们昭示任何东西,也不给我们带来任何好处,它们与人对话的时代过去了。” 《万古》杂志的专栏作家达米安·沃尔特在一篇名为《大逃亡》的文章中写到当下人类社会面临的一个绝妙的反讽:在科学技术驱动之下的现代社会,崇尚理性,背离神明,拥抱现实,但技术并没有消灭我们对魔法、恐惧、神秘的强烈兴趣。我们清空教堂,紧接着就把它们改造成了电影院。《哈利·波特》和《饥饿游戏》取代了《圣经》;我们想象力的内在世界曾经是祈祷和灵修之所,现在则嵌入到了计算机构筑的数字疆域中。 在《游戏的人》中,约翰·赫伊津哈谈到游戏的“愉悦”(fun)本质时说,游戏的本质是一种激动、专注、生机勃勃的力量。与这种力量形成鲜明对比的,恰恰是现实人生难以忍受的单调、乏味以及无意义。 从足球、《俄罗斯方块》到《魔兽世界》,游戏似乎有一种离奇的魅惑人心的力量。一旦被勾引,人们就会花费数不尽的时间去追求那些看似怪异、独断的目标——把一个球踢进球门,用方块填满一列横向格子,不厌其烦地收集某种怪物的脑袋、牙齿、眼睛、尾巴…… 在过去的三四十年里,游戏工业更是创造了一套神奇的机制,比任何一种媒介更具黏性,更能刺激人的参与热情。它有非常清晰的指令,告诉你应该做什么,把你的注意力集中在一个个具体任务上。而且,不像电影或者电视,你只能看着别人行动,在游戏里你永远是一个主角,有自主的意志。而多人游戏则给你一种归属感,让你觉得自己属于一个集体,跟喜欢的人在一起,有愉悦的社交生活。 游戏有即时的反馈系统,得分、过关和晋级给你一种明确的可衡量的进步感。每一个玩家从相同的位置出发,只要付出努力,就会收获回报——从童年时代起,我们就以为世界是这样的,但却在真实的世界从未真正得到。 最重要的是,与现实人生不同,游戏是合理的。无论什么游戏,足球、围棋、《魔兽世界》,都有基本的规则,决定一个人最终的成败,而这些规则,不像那些现实中的规则,是对所有人都清晰且公平。 以前,我们对于一个人沉浸在游戏世界里的态度是明确的:这是一种对现实的逃避,而逃避现实常常与“疯狂”画上等号——那些脑子里充斥着幻觉和幻象的人,是“脱离现实”,或者太愚蠢、太无能,以至于无法应付日常生活中的障碍。 但是,随着游戏作为一种媒介的演化,随着游戏进一步渗透到社会各个阶层与群体,我们与游戏之间、游戏与现实之间的关系也变得更加错综复杂。 我的朋友A是一个插画师,她爱玩《部落冲突》,每天早上起床第一件事就是拿起手机收金币,给游戏里的人物买点漂亮衣服,偶尔也和游戏里认识的朋友玩麻将。对她而言,游戏不仅仅是无聊工作中的一点精神刺激与愉悦,也是孤独中真实的慰藉。“游戏是一个完全虚拟的二次元世界,但在游戏背后,人和人的相处,所付出的情感是和二次元却没有任何区别的。游戏里一个跟你玩得开心的人,从某一天开始就再也不上线了,并且你的好友名单里,他的名字从此永远灰了下去。即使在游戏世界里,这种事情带来的伤感也是很真实的。” 我的朋友B曾经有三年的时间里完全沉迷于《魔兽世界》,没有工作,没有家庭,整天独自躲在书房里,一支烟接着一支烟,手指片刻不曾离开键盘与鼠标。看着他的样子,你会觉得他的人生可悲极了。但在那个我无法理解的虚拟世界里,他志得意满地指挥着千军万马,攻城伐地,受万人敬仰。如今,他浪子回头,娶妻生子,做着自己的小生意,往日种种,犹如一场大病,但病愈之后,似乎再也没有了往日的生气勃勃。至少我不敢断定,他的现实人生就比虚拟人生更有价值。 如今,我们越来越生活在一个半真实半虚拟的世界里。虚拟世界与现实世界以各种方式诡异重叠,叠合之处为各种新型的游戏提供了新的画布。越来越多的游戏从现实取材,关于暴力、关于宗教、关于战争、关于政治、关于死亡;或者将游戏延伸到现实空间,鼓励玩家不断回到现实世界,寻找游戏内完成任务所需的线索;或者在现实空间里扮演虚拟世界里的角色,比如从北欧流行起来的LARP游戏;又或者在现实之上叠加一层虚拟游戏体验,比如最近很流行的《口袋妖怪Go》…… 这些游戏的一个共同点,就是承诺要提供一种不同的观察、理解甚至参与现实世界的方式,而不同之处则在于它们对于现实的预判各有不同。我们所面对的,到底是一个破碎的现实,需要引入游戏的机制来修补,还是说,现实从来都是如此,而游戏只是一种工具,帮助我们发现和欣赏这个现实世界真正的乐趣与意义所在? 版权声明:凡注明“三联生活周刊”、“爱乐”或“原创”来源之作品(文字、图片、音频、视频),未经三联生活周刊或爱乐杂志授权,任何媒体和个人不得转载 、链接、转贴或以其它方式使用;已经本刊、本网书面授权的,在使用时必须注明“来源:三联生活周刊”或“来源:爱乐”。违反上述声明的,本刊、本网将追究其相关法律责任。 Save to Pocket

添加于 2017年3月15日星期三 上午12:02:49 在位置 #4755 的文章剪切

TaterLi's LazyBlog 三重采样很简单,就是三个ADC叠加成更高速度,但是不是所有通道都支持三重采样.如图,只有写着ADC123_INx的才可以. 当初改掉原来官方的ADC1 + ADC2接PA4结果什么用都没,真是麻烦.另外只能按照WORD传输.进入DMA中断后要赶紧处理数据.取出高16和低16位.这个三重下,顺序是比较复杂(其实也就是先来后到),不过实际上不用管,当做只有一个ADC在工作就好了.         aADCxMultimodeDualMasterConvertedData[tmp_index] = (uint16_t) __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(LL_ADC_MULTI_MASTER, aADCxADCyMultimodeDualConvertedData[tmp_index]); aADCyMultimodeDualSlaveConvertedData[tmp_index]  = (uint16_t) __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(LL_ADC_MULTI_SLAVE, aADCxADCyMultimodeDualConvertedData[tmp_index]); 得到数据该怎么处理就怎么处理,这么快速度,串口是发不走的了,因为串口至少得144000000bps,不太可能,看看怎么送出去了,这数据.或者处理. /** ****************************************************************************** * @file    Examples_LL/ADC/ADC_MultimodeDualInterleaved/Src/main.c * @author  MCD Application Team * @version V1.0.0 * @date    30-December-2016 * @brief   This example describes how to use several ADC peripherals in *          multimode, mode interleaved. *          ADC master instance synchronizes and manages ADC slave instance. *          Multimode interleaved combines ADC instances to convert *          the same channel and increase the overall ADC conversion rate. *          This example configures the ADC to perform conversions at the *          maximum ADC conversion rate possible (with a sampling time *          corresponding to ADC resolution 12 bits). *          This example is based on the STM32F7xx ADC LL API; *          Peripheral initialization done using LL unitary services functions. ****************************************************************************** * @attention * * 

© COPYRIGHT(c) 2016 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: *   1. Redistributions of source code must retain the above copyright notice, *      this list of conditions and the following disclaimer. *   2. Redistributions in binary form must reproduce the above copyright notice, *      this list of conditions and the following disclaimer in the documentation *      and/or other materials provided with the distribution. *   3. Neither the name of STMicroelectronics nor the names of its contributors *      may be used to endorse or promote products derived from this software *      without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /** @addtogroup STM32F7xx_LL_Examples * @{ */ /** @addtogroup ADC_MultimodeDualInterleaved * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Definitions of ADC hardware constraints delays */ /* Note: Only ADC IP HW delays are defined in ADC LL driver driver,           */ /*       not timeout values:                                                  */ /*       Timeout values for ADC operations are dependent to device clock      */ /*       configuration (system clock versus ADC clock),                       */ /*       and therefore must be defined in user application.                   */ /*       Refer to @ref ADC_LL_EC_HW_DELAYS for description of ADC timeout     */ /*       values definition.                                                   */ /* Timeout values for ADC operations. */ /* (enable settling time, disable settling time, ...)                       */ /* Values defined to be higher than worst cases: low clock frequency,       */ /* maximum prescalers.                                                      */ /* Example of profile very low frequency : ADC clock frequency 36MHz        */ /* prescaler 2, sampling time 56 ADC clock cycles, resolution 12 bits.      */ /*  - ADC enable time: maximum delay is 3 us                                */ /*    (refer to device datasheet, parameter "tSTAB")                        */ /*  - ADC disable time: maximum delay should be a few ADC clock cycles      */ /*  - ADC stop conversion time: maximum delay should be a few ADC clock     */ /*    cycles                                                                */ /*  - ADC conversion time: with this hypothesis of clock settings, maximum  */ /*    delay will be 99us.                                                   */ /*    (refer to device reference manual, section "Timing")                  */ /* Unit: ms                                                                 */ #define ADC_CALIBRATION_TIMEOUT_MS       ((uint32_t)   1) #define ADC_ENABLE_TIMEOUT_MS            ((uint32_t)   1) #define ADC_DISABLE_TIMEOUT_MS           ((uint32_t)   1) #define ADC_STOP_CONVERSION_TIMEOUT_MS   ((uint32_t)   1) #define ADC_CONVERSION_TIMEOUT_MS        ((uint32_t)   2) /* Definitions of environment analog values */ /* Value of analog reference voltage (Vref+), connected to analog voltage   */ /* supply Vdda (unit: mV).                                                  */ #define VDDA_APPLI                       ((uint32_t)3300) /* Definitions of data related to this example */ /* Init variable out of expected ADC conversion data range */ #define VAR_CONVERTED_DATA_INIT_VALUE    (__LL_ADC_DIGITAL_SCALE(LL_ADC_RESOLUTION_12B) + 1) /* Definition of ADCx conversions data table size */ /* Note: Considering interruption occurring after each number of            */ /*       "ADC_CONVERTED_DATA_BUFFER_SIZE" ADC conversions                   */ /*       (IT from DMA transfer complete),                                   */ /*       select sampling time and ADC clock with sufficient                 */ /*       duration to not create an overhead situation in IRQHandler.        */ #define ADC_CONVERTED_DATA_BUFFER_SIZE   ((uint32_t) 256) /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Variables for ADC conversion data */ __IO   uint32_t aADCxADCyMultimodeDualConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];     /* ADC multimode dual conversion data: ADC master and ADC slave conversion data are concatenated in a registers of 32 bits. */ static uint16_t aADCxMultimodeDualMasterConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];/* For the purpose of this example, dispatch multimode dual conversion data into array corresponding to ADC master conversion data. */ static uint16_t aADCyMultimodeDualSlaveConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE]; /* For the purpose of this example, dispatch multimode dual conversion data into array corresponding to ADC slave conversion data. */ /* Variable to report status of DMA transfer of ADC group regular conversions */ /*  0: DMA transfer is not completed                                          */ /*  1: DMA transfer is completed                                              */ /*  2: DMA transfer has not been started yet (initial state)                  */ __IO uint8_t ubDmaTransferStatus = 2; /* Variable set into DMA interruption callback */ /* Private function prototypes -----------------------------------------------*/ void     SystemClock_Config(void); void     Configure_DMA(void); void     Configure_ADC(void); void     Configure_ADC_slave(void); void     Activate_ADC(void); void     Activate_ADC_slave(void); static void CPU_CACHE_Enable(void); /* Private functions ---------------------------------------------------------*/ /** * @brief  Main program * @param  None * @retval None */ int main(void) { /* Enable the CPU Cache */ CPU_CACHE_Enable(); /* Configure the system clock to 216 MHz */ SystemClock_Config(); /* Initialize button in EXTI mode */ /* UserButton_Init(); */ /* Configure DMA for data transfer from ADC */ Configure_DMA(); /* Configure ADC */ /* Note: This function configures the ADC but does not enable it.           */ /*       To enable it, use function "Activate_ADC()".                       */ /*       This is intended to optimize power consumption:                    */ /*       1. ADC configuration can be done once at the beginning             */ /*          (ADC disabled, minimal power consumption)                       */ /*       2. ADC enable (higher power consumption) can be done just before   */ /*          ADC conversions needed.                                         */ /*          Then, possible to perform successive "Activate_ADC()",          */ /*          "Deactivate_ADC()", ..., without having to set again            */ /*          ADC configuration.                                              */ Configure_ADC(); /* For multimode, configure ADC slave */ Configure_ADC_slave(); /* Activate ADC */ /* Perform ADC activation procedure to make it ready to convert. */ Activate_ADC(); Activate_ADC_slave(); LL_ADC_REG_StartConversionSWStart(ADC1); /* Infinite loop */ while (1) { /* Note: ADC group regular conversion start is done into push button      */ /*       IRQ handler, refer to function "UserButton_Callback()".          */ /* Note: LED state depending on DMA transfer status is set into DMA       */ /*       IRQ handler, refer to functions "DmaTransferComplete()"          */ /*       and "DmaTransferHalfComplete()".                                 */ /* Note: ADC conversion data are stored into array                        */ /*       "aADCxADCyMultimodeDualConvertedData".                           */ /*       For this example purpose, ADC conversion data of ADC master and  */ /*       ADC slave are dispatched into arrays */ /*       "aADCxMultimodeDualMasterConvertedData"                          */ /*       and "aADCyMultimodeDualSlaveConvertedData", refer to comments    */ /*       into function "DmaTransferComplete()".                           */ /*       (for debug: see variable content into watch window).             */ /* Note: ADC conversion data can be computed to physical values           */ /*       using ADC LL driver helper macro:                                */ /*         uhADCxConvertedData_Voltage_mVolt                              */ /*         = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI,                    */ /*                                      uhADCxConvertedData),             */ /*                                      LL_ADC_RESOLUTION_12B)            */ } } /** * @brief  This function configures DMA for transfer of data from ADC * @param  None * @retval None */ void Configure_DMA(void) { /*## Configuration of NVIC #################################################*/ /* Configure NVIC to enable DMA interruptions */ NVIC_SetPriority(DMA2_Stream0_IRQn, 1);  /* DMA IRQ lower priority than ADC IRQ */ NVIC_EnableIRQ(DMA2_Stream0_IRQn); /*## Configuration of DMA ##################################################*/ /* Enable the peripheral clock of DMA */ LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA2); /* Configure the DMA transfer */ /*  - DMA transfer in circular mode to match with ADC configuration:        */ /*    DMA unlimited requests.                                               */ /*  - DMA transfer from ADC without address increment.                      */ /*  - DMA transfer to memory with address increment.                        */ /*  - DMA transfer from ADC by word to match with ADC configuration:        */ /*    ADC resolution 12 bits and and multimode enabled,                     */ /*    ADC master and ADC slave conversion data are concatenated in          */ /*    a register of 32 bits.                                                */ /*  - DMA transfer to memory by word to match with ADC conversion data      */ /*    buffer variable type: word.                                           */ LL_DMA_SetChannelSelection(DMA2, LL_DMA_STREAM_0, LL_DMA_CHANNEL_0); LL_DMA_ConfigTransfer(DMA2, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY | LL_DMA_MODE_CIRCULAR              | LL_DMA_PERIPH_NOINCREMENT         | LL_DMA_MEMORY_INCREMENT           | LL_DMA_PDATAALIGN_WORD            | LL_DMA_MDATAALIGN_WORD            | LL_DMA_PRIORITY_HIGH               ); /* Set DMA transfer addresses of source and destination */ /* Note: On this STM32 device, in multimode, ADC conversion data with       */ /*       ADC master and ADC slave conversion data concatenated are located  */ /*       in a specific multimode data register.                             */ LL_DMA_ConfigAddresses(DMA2, LL_DMA_STREAM_0, LL_ADC_DMA_GetRegAddr(ADC1, LL_ADC_DMA_REG_REGULAR_DATA_MULTI), (uint32_t)&aADCxADCyMultimodeDualConvertedData, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); /* Set DMA transfer size */ LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_0, ADC_CONVERTED_DATA_BUFFER_SIZE); /* Enable DMA transfer interruption: transfer complete */ LL_DMA_EnableIT_TC(DMA2, LL_DMA_STREAM_0); /*## Activation of DMA #####################################################*/ /* Enable the DMA transfer */ LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_0); } /** * @brief  Configure ADC (ADC instance: ADC1) and GPIO used by ADC channels. * @note   In case re-use of this function outside of this example: *         This function includes checks of ADC hardware constraints before *         executing some configuration functions. *         - In this example, all these checks are not necessary but are *           implemented anyway to show the best practice usages *           corresponding to reference manual procedure. *           (On some STM32 series, setting of ADC features are not *           conditioned to ADC state. However, in order to be compliant with *           other STM32 series and to show the best practice usages, *           ADC state is checked anyway with same constraints). *           Software can be optimized by removing some of these checks, *           if they are not relevant considering previous settings and actions *           in user application. *         - If ADC is not in the appropriate state to modify some parameters, *           the setting of these parameters is bypassed without error *           reporting: *           it can be the expected behavior in case of recall of this *           function to update only a few parameters (which update fullfills *           the ADC state). *           Otherwise, it is up to the user to set the appropriate error *           reporting in user application. * @note   Peripheral configuration is minimal configuration from reset values. *         Thus, some useless LL unitary functions calls below are provided as *         commented examples - setting is default configuration from reset. * @param  None * @retval None */ void Configure_ADC(void) { /*## Configuration of GPIO used by ADC channels ############################*/ /* Note: On this STM32 device, ADC1 channel 4 is mapped on GPIO pin PA.04 */ /* Enable GPIO Clock */ LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); /* Configure GPIO in analog mode to be used as ADC input */ LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_0, LL_GPIO_MODE_ANALOG); /*## Configuration of ADC ##################################################*/ /*## Configuration of ADC hierarchical scope: common to several ADC ########*/ /* Enable ADC clock (core clock) */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1); /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, in order to be compliant with other STM32 series          */ /*       and to show the best practice usages, ADC state is checked.        */ /*       Software can be optimized by removing some of these checks, if     */ /*       they are not relevant considering previous settings and actions    */ /*       in user application.                                               */ if(__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE() == 0) { /* Note: Call of the functions below are commented because they are       */ /*       useless in this example:                                         */ /*       setting corresponding to default configuration from reset state. */ /* Set ADC clock (conversion clock) common to several ADC instances */ LL_ADC_SetCommonClock(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_CLOCK_SYNC_PCLK_DIV2); /* Set ADC measurement path to internal channels */ // LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_NONE); /*## Configuration of ADC hierarchical scope: multimode ####################*/ /* Set ADC multimode configuration */ LL_ADC_SetMultimode(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_MULTI_TRIPLE_REG_INTERL); /* Set ADC multimode DMA transfer */ LL_ADC_SetMultiDMATransfer(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_MULTI_REG_DMA_UNLMT_3); /* Set ADC multimode: delay between 2 sampling phases */ /* Note: Delay has been chosen to have ADC2 conversion start in the       */ /*       mid-delay between ADC1 conversions.                              */ LL_ADC_SetMultiTwoSamplingDelay(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES); } /*## Configuration of ADC hierarchical scope: ADC instance #################*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, ADC state is checked anyway with standard requirements    */ /*       (refer to description of this function).                           */ if (LL_ADC_IsEnabled(ADC1) == 0) { /* Note: Call of the functions below are commented because they are       */ /*       useless in this example:                                         */ /*       setting corresponding to default configuration from reset state. */ /* Set ADC data resolution */ // LL_ADC_SetResolution(ADC1, LL_ADC_RESOLUTION_12B); /* Set ADC conversion data alignment */ // LL_ADC_SetResolution(ADC1, LL_ADC_DATA_ALIGN_RIGHT); /* Set Set ADC sequencers scan mode, for all ADC groups                   */ /* (group regular, group injected).                                       */ // LL_ADC_SetSequencersScanMode(ADC1, LL_ADC_SEQ_SCAN_DISABLE); } /*## Configuration of ADC hierarchical scope: ADC group regular ############*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, ADC state is checked anyway with standard requirements    */ /*       (refer to description of this function).                           */ if (LL_ADC_IsEnabled(ADC1) == 0) { /* Set ADC group regular trigger source */ LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_SOFTWARE); /* Set ADC group regular trigger polarity */ // LL_ADC_REG_SetTriggerEdge(ADC1, LL_ADC_REG_TRIG_EXT_RISING); /* Set ADC group regular continuous mode */ LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_CONTINUOUS); /* Set ADC group regular conversion data transfer */ /* Note: Both ADC master and ADC slave have multimode setting             */ /*       to use 1 DMA channel for all ADC instances.                      */ /*       In this case, each ADC instance must have setting of             */ /*       ADC DMA request set to default value (no DMA transfer).          */ /*       and ADC DMA transfer is managed by ADC common instance.          */ /*       Refer to function "LL_ADC_SetMultiDMATransfer()".                */ LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_NONE); /* Set ADC group regular sequencer */ /* Note: On this STM32 serie, ADC group regular sequencer is              */ /*       fully configurable: sequencer length and each rank               */ /*       affectation to a channel are configurable.                       */ /*       Refer to description of function                                 */ /*       "LL_ADC_REG_SetSequencerLength()".                               */ /* Set ADC group regular sequencer length and scan direction */ LL_ADC_REG_SetSequencerLength(ADC1, LL_ADC_REG_SEQ_SCAN_DISABLE); /* Set ADC group regular sequencer discontinuous mode */ // LL_ADC_REG_SetSequencerDiscont(ADC1, LL_ADC_REG_SEQ_DISCONT_DISABLE); /* Set ADC group regular sequence: channel on the selected sequence rank. */ LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_0); } /*## Configuration of ADC hierarchical scope: ADC group injected ###########*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, ADC state is checked anyway with standard requirements    */ /*       (refer to description of this function).                           */ if (LL_ADC_IsEnabled(ADC1) == 0) { /* Note: Call of the functions below are commented because they are       */ /*       useless in this example:                                         */ /*       setting corresponding to default configuration from reset state. */ /* Set ADC group injected trigger source */ // LL_ADC_INJ_SetTriggerSource(ADC1, LL_ADC_INJ_TRIG_SOFTWARE); /* Set ADC group injected trigger polarity */ // LL_ADC_INJ_SetTriggerEdge(ADC1, LL_ADC_INJ_TRIG_EXT_RISING); /* Set ADC group injected conversion trigger  */ // LL_ADC_INJ_SetTrigAuto(ADC1, LL_ADC_INJ_TRIG_INDEPENDENT); /* Set ADC group injected sequencer */ /* Note: On this STM32 serie, ADC group injected sequencer is             */ /*       fully configurable: sequencer length and each rank               */ /*       affectation to a channel are configurable.                       */ /*       Refer to description of function                                 */ /*       "LL_ADC_INJ_SetSequencerLength()".                               */ /* Set ADC group injected sequencer length and scan direction */ // LL_ADC_INJ_SetSequencerLength(ADC1, LL_ADC_INJ_SEQ_SCAN_DISABLE); /* Set ADC group injected sequencer discontinuous mode */ // LL_ADC_INJ_SetSequencerDiscont(ADC1, LL_ADC_INJ_SEQ_DISCONT_DISABLE); /* Set ADC group injected sequence: channel on the selected sequence rank. */ // LL_ADC_INJ_SetSequencerRanks(ADC1, LL_ADC_INJ_RANK_1, LL_ADC_CHANNEL_0); } /*## Configuration of ADC hierarchical scope: channels #####################*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, in order to be compliant with other STM32 series          */ /*       and to show the best practice usages, ADC state is checked.        */ /*       Software can be optimized by removing some of these checks, if     */ /*       they are not relevant considering previous settings and actions    */ /*       in user application.                                               */ if (LL_ADC_IsEnabled(ADC1) == 0) { /* Set ADC channels sampling time */ /* Note: Considering interruption occurring after each number of          */ /*       "ADC_CONVERTED_DATA_BUFFER_SIZE" ADC conversions                 */ /*       (IT from DMA transfer complete),                                 */ /*       select sampling time and ADC clock with sufficient               */ /*       duration to not create an overhead situation in IRQHandler.      */ LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_0, LL_ADC_SAMPLINGTIME_3CYCLES); } /*## Configuration of ADC transversal scope: analog watchdog ###############*/ /* Note: On this STM32 serie, there is only 1 analog watchdog available.    */ /* Set ADC analog watchdog: channels to be monitored */ // LL_ADC_SetAnalogWDMonitChannels(ADC1, LL_ADC_AWD_DISABLE); /* Set ADC analog watchdog: thresholds */ // LL_ADC_SetAnalogWDThresholds(ADC1, LL_ADC_AWD_THRESHOLD_HIGH, __LL_ADC_DIGITAL_SCALE(LL_ADC_RESOLUTION_12B)); // LL_ADC_SetAnalogWDThresholds(ADC1, LL_ADC_AWD_THRESHOLD_LOW, 0x000); /*## Configuration of ADC transversal scope: oversampling ##################*/ /* Note: Feature not available on this STM32 serie */ /* Note: in this example, ADC group regular end of conversions              */ /*       (number of ADC conversions defined by DMA buffer size)             */ /*       are notified by DMA transfer interruptions).                       */ } /** * @brief  For multimode, configure ADC slave (ADC instance: ADC2) *         and GPIO used by ADC channels. * @note   Configuration of GPIO: *           Not configured: same as ADC master (ADC slave shares the common configuration of ADC master) *         Configuration of ADC: *         - Common to several ADC: *           Not configured: same as ADC master (ADC slave shares the common configuration of ADC master) *         - Multimode *           Not configured: same as ADC master (ADC slave shares the common configuration of ADC master) * @note   In case re-use of this function outside of this example: *         This function includes checks of ADC hardware constraints before *         executing some configuration functions. *         - In this example, all these checks are not necessary but are *           implemented anyway to show the best practice usages *           corresponding to reference manual procedure. *           (On some STM32 series, setting of ADC features are not *           conditioned to ADC state. However, in order to be compliant with *           other STM32 series and to show the best practice usages, *           ADC state is checked anyway with same constraints). *           Software can be optimized by removing some of these checks, *           if they are not relevant considering previous settings and actions *           in user application. *         - If ADC is not in the appropriate state to modify some parameters, *           the setting of these parameters is bypassed without error *           reporting: *           it can be the expected behavior in case of recall of this *           function to update only a few parameters (which update fullfills *           the ADC state). *           Otherwise, it is up to the user to set the appropriate error *           reporting in user application. * @note   Peripheral configuration is minimal configuration from reset values. *         Thus, some useless LL unitary functions calls below are provided as *         commented examples - setting is default configuration from reset. * @param  None * @retval None */ void Configure_ADC_slave(void) { /*## Configuration of GPIO used by ADC channels ############################*/ /* Note: not configured: In this example, ADC slave group regular converts  */ /*       the same channel as ADC master group regular.                      */ /*       Channel configuration same as ADC master.                          */ /*## Configuration of ADC ##################################################*/ /* Enable ADC clock (core clock) */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC2); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC3); /*## Configuration of ADC hierarchical scope: common to several ADC ########*/ /* Note: ADC clock (core clock) not configured: same as ADC master          */ /*       (ADC slave shares the common clock of ADC master).                 */ /* Note: not configured: same as ADC master (ADC slave shares the common    */ /*       configuration of ADC master).                                      */ /*## Configuration of ADC hierarchical scope: multimode ####################*/ /* Note: not configured: same as ADC master (ADC slave shares the common    */ /*       configuration of ADC master).                                      */ /*## Configuration of ADC hierarchical scope: ADC instance #################*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, ADC state is checked anyway with standard requirements    */ /*       (refer to description of this function).                           */ if (LL_ADC_IsEnabled(ADC2) == 0) { /* Note: Call of the functions below are commented because they are       */ /*       useless in this example:                                         */ /*       setting corresponding to default configuration from reset state. */ /* Set ADC data resolution */ // LL_ADC_SetResolution(ADC2, LL_ADC_RESOLUTION_12B); /* Set ADC conversion data alignment */ // LL_ADC_SetResolution(ADC2, LL_ADC_DATA_ALIGN_RIGHT); /* Set Set ADC sequencers scan mode, for all ADC groups                   */ /* (group regular, group injected).                                       */ LL_ADC_SetSequencersScanMode(ADC2, LL_ADC_SEQ_SCAN_ENABLE); LL_ADC_SetSequencersScanMode(ADC3, LL_ADC_SEQ_SCAN_ENABLE); } /*## Configuration of ADC hierarchical scope: ADC group regular ############*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, ADC state is checked anyway with standard requirements    */ /*       (refer to description of this function).                           */ if (LL_ADC_IsEnabled(ADC2) == 0) { /* Set ADC group regular trigger source */ /* Note: On this STM32 device, in multimode, ADC slave trigger source     */ /*       setting is mandatory: SW start.                                  */ LL_ADC_REG_SetTriggerSource(ADC2, LL_ADC_REG_TRIG_SOFTWARE); LL_ADC_REG_SetTriggerSource(ADC3, LL_ADC_REG_TRIG_SOFTWARE); /* Set ADC group regular continuous mode */ /* Note: On this STM32 device, in multimode, ADC slave continuous         */ /*       conversions mode must be the same as ADC master.                 */ LL_ADC_REG_SetContinuousMode(ADC2, LL_ADC_REG_CONV_CONTINUOUS); LL_ADC_REG_SetContinuousMode(ADC3, LL_ADC_REG_CONV_CONTINUOUS); /* Set ADC group regular conversion data transfer */ /* Note: Both ADC master and ADC slave have multimode setting             */ /*       to use 1 DMA channel for all ADC instances.                      */ /*       In this case, each ADC instance must have setting of             */ /*       ADC DMA request set to default value (no DMA transfer).          */ /*       and ADC DMA transfer is managed by ADC common instance.          */ /*       Refer to function "LL_ADC_SetMultiDMATransfer()".                */ LL_ADC_REG_SetDMATransfer(ADC2, LL_ADC_REG_DMA_TRANSFER_NONE); LL_ADC_REG_SetDMATransfer(ADC3, LL_ADC_REG_DMA_TRANSFER_NONE); /* Specify which ADC flag between EOC (end of unitary conversion)         */ /* or EOS (end of sequence conversions) is used to indicate               */ /* the end of conversion.                                                 */ // LL_ADC_REG_SetFlagEndOfConversion(ADC2, LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV); /* Set ADC group regular sequencer */ /* Note: On this STM32 serie, ADC group regular sequencer is              */ /*       fully configurable: sequencer length and each rank               */ /*       affectation to a channel are configurable.                       */ /*       Refer to description of function                                 */ /*       "LL_ADC_REG_SetSequencerLength()".                               */ /* Set ADC group regular sequencer length and scan direction */ LL_ADC_REG_SetSequencerLength(ADC2, LL_ADC_REG_SEQ_SCAN_DISABLE); LL_ADC_REG_SetSequencerLength(ADC3, LL_ADC_REG_SEQ_SCAN_DISABLE); /* Set ADC group regular sequencer discontinuous mode */ // LL_ADC_REG_SetSequencerDiscont(ADC2, LL_ADC_REG_SEQ_DISCONT_DISABLE); /* Set ADC group regular sequence: channel on the selected sequence rank. */ LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_0); LL_ADC_REG_SetSequencerRanks(ADC3, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_0); } /*## Configuration of ADC hierarchical scope: ADC group injected ###########*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, ADC state is checked anyway with standard requirements    */ /*       (refer to description of this function).                           */ if (LL_ADC_IsEnabled(ADC2) == 0) { /* Note: Call of the functions below are commented because they are       */ /*       useless in this example:                                         */ /*       setting corresponding to default configuration from reset state. */ /* Set ADC group injected trigger source */ // LL_ADC_INJ_SetTriggerSource(ADC2, LL_ADC_INJ_TRIG_SOFTWARE); /* Set ADC group injected trigger polarity */ // LL_ADC_INJ_SetTriggerEdge(ADC2, LL_ADC_INJ_TRIG_EXT_RISING); /* Set ADC group injected conversion trigger  */ // LL_ADC_INJ_SetTrigAuto(ADC2, LL_ADC_INJ_TRIG_INDEPENDENT); /* Set ADC group injected sequencer */ /* Note: On this STM32 serie, ADC group injected sequencer is             */ /*       fully configurable: sequencer length and each rank               */ /*       affectation to a channel are configurable.                       */ /*       Refer to description of function                                 */ /*       "LL_ADC_INJ_SetSequencerLength()".                               */ /* Set ADC group injected sequencer length and scan direction */ // LL_ADC_INJ_SetSequencerLength(ADC2, LL_ADC_INJ_SEQ_SCAN_DISABLE); /* Set ADC group injected sequencer discontinuous mode */ // LL_ADC_INJ_SetSequencerDiscont(ADC2, LL_ADC_INJ_SEQ_DISCONT_DISABLE); /* Set ADC group injected sequence: channel on the selected sequence rank. */ // LL_ADC_INJ_SetSequencerRanks(ADC2, LL_ADC_INJ_RANK_1, LL_ADC_CHANNEL_0); } /*## Configuration of ADC hierarchical scope: channels #####################*/ /* Note: not configured: In this example, ADC slave group regular converts  */ /*       the same channel as ADC master group regular.                      */ /*       Channel configuration same as ADC master.                          */ /*## Configuration of ADC transversal scope: analog watchdog ###############*/ /* Note: On this STM32 serie, there is only 1 analog watchdog available.    */ /* Set ADC analog watchdog: channels to be monitored */ // LL_ADC_SetAnalogWDMonitChannels(ADC2, LL_ADC_AWD_DISABLE); /* Set ADC analog watchdog: thresholds */ // LL_ADC_SetAnalogWDThresholds(ADC2, LL_ADC_AWD_THRESHOLD_HIGH, __LL_ADC_DIGITAL_SCALE(LL_ADC_RESOLUTION_12B)); // LL_ADC_SetAnalogWDThresholds(ADC2, LL_ADC_AWD_THRESHOLD_LOW, 0x000); /*## Configuration of ADC transversal scope: oversampling ##################*/ /* Note: Feature not available on this STM32 serie */ /* Note: in this example, ADC group regular end of conversions              */ /*       (number of ADC conversions defined by DMA buffer size)             */ /*       are notified by DMA transfer interruptions).                       */ } /** * @brief  Perform ADC activation procedure to make it ready to convert *         (ADC instance: ADC1). * @note   Operations: *         - ADC instance *           - Enable ADC *         - ADC group regular *           none: ADC conversion start-stop to be performed *                 after this function *         - ADC group injected *           none: ADC conversion start-stop to be performed *                 after this function * @param  None * @retval None */ void Activate_ADC(void) { #if (USE_TIMEOUT == 1) uint32_t Timeout = 0; /* Variable used for timeout management */ #endif /* USE_TIMEOUT */ /*## Operation on ADC hierarchical scope: ADC instance #####################*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, in order to be compliant with other STM32 series          */ /*       and to show the best practice usages, ADC state is checked.        */ /*       Software can be optimized by removing some of these checks, if     */ /*       they are not relevant considering previous settings and actions    */ /*       in user application.                                               */ if (LL_ADC_IsEnabled(ADC1) == 0) { /* Enable ADC */ LL_ADC_Enable(ADC1); } /*## Operation on ADC hierarchical scope: ADC group regular ################*/ /* Note: No operation on ADC group regular performed here.                  */ /*       ADC group regular conversions to be performed after this function  */ /*       using function:                                                    */ /*       "LL_ADC_REG_StartConversion();"                                    */ /*## Operation on ADC hierarchical scope: ADC group injected ###############*/ /* Note: No operation on ADC group injected performed here.                 */ /*       ADC group injected conversions to be performed after this function */ /*       using function:                                                    */ /*       "LL_ADC_INJ_StartConversion();"                                    */ } /** * @brief  Perform ADC activation procedure to make it ready to convert *         (ADC instance: ADC2, used as ADC slave in multimode configuration). * @note   Operations: *         - ADC instance *           - Enable ADC *         - ADC group regular *           none: ADC conversion start-stop to be performed *                 after this function *         - ADC group injected *           none: ADC conversion start-stop to be performed *                 after this function * @param  None * @retval None */ void Activate_ADC_slave(void) { #if (USE_TIMEOUT == 1) uint32_t Timeout = 0; /* Variable used for timeout management */ #endif /* USE_TIMEOUT */ /*## Operation on ADC hierarchical scope: ADC instance #####################*/ /* Note: Hardware constraint (refer to description of the functions         */ /*       below):                                                            */ /*       On this STM32 serie, setting of these features are not             */ /*       conditioned to ADC state.                                          */ /*       However, in order to be compliant with other STM32 series          */ /*       and to show the best practice usages, ADC state is checked.        */ /*       Software can be optimized by removing some of these checks, if     */ /*       they are not relevant considering previous settings and actions    */ /*       in user application.                                               */ if (LL_ADC_IsEnabled(ADC2) == 0) { /* Enable ADC */ LL_ADC_Enable(ADC2); LL_ADC_Enable(ADC3); } /*## Operation on ADC hierarchical scope: ADC group regular ################*/ /* Note: No operation on ADC group regular performed here.                  */ /*       In ADC multimode group regular interleaved, ADC slave conversions  */ /*       start and stop are controlled by ADC master.                       */ /*## Operation on ADC hierarchical scope: ADC group injected ###############*/ /* Note: No operation on ADC group injected performed here.                 */ /*       ADC group injected conversions to be performed after this function */ /*       using function:                                                    */ /*       "LL_ADC_INJ_StartConversion();"                                    */ } /** * @brief  System Clock Configuration *         The system Clock is configured as follow : *            System Clock source            = PLL (HSE) *            SYSCLK(Hz)                     = 216000000 *            HCLK(Hz)                       = 216000000 *            AHB Prescaler                  = 1 *            APB1 Prescaler                 = 4 *            APB2 Prescaler                 = 2 *            HSI Frequency(Hz)              = 8000000 *            PLL_M                          = 8 *            PLL_N                          = 432 *            PLL_P                          = 2 *            VDD(V)                         = 3.3 *            Main regulator output voltage  = Scale1 mode *            Flash Latency(WS)              = 7 * @param  None * @retval None */ void SystemClock_Config(void) { /* Enable HSE clock */ LL_RCC_HSE_EnableBypass(); LL_RCC_HSE_Enable(); while(LL_RCC_HSE_IsReady() != 1) { }; /* Set FLASH latency */ LL_FLASH_SetLatency(LL_FLASH_LATENCY_7); /* Enable PWR clock */ LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); /* Activation OverDrive Mode */ LL_PWR_EnableOverDriveMode(); while(LL_PWR_IsActiveFlag_OD() != 1) { }; /* Activation OverDrive Switching */ LL_PWR_EnableOverDriveSwitching(); while(LL_PWR_IsActiveFlag_ODSW() != 1) { }; /* Main PLL configuration and activation */ LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_8, 432, LL_RCC_PLLP_DIV_2); LL_RCC_PLL_Enable(); while(LL_RCC_PLL_IsReady() != 1) { }; /* Sysclk activation on the main PLL */ LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { }; /* Set APB1 & APB2 prescaler */ LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_4); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_2); /* Set systick to 1ms */ SysTick_Config(216000000 / 1000); /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ SystemCoreClock = 216000000; } /** * @brief  CPU L1-Cache enable. * @param  None * @retval None */ static void CPU_CACHE_Enable(void) { /* Enable I-Cache */ SCB_EnableICache(); /* Enable D-Cache */ SCB_EnableDCache(); } /******************************************************************************/ /*   USER IRQ HANDLER TREATMENT                                               */ /******************************************************************************/ /** * @brief  DMA transfer complete callback * @note   This function is executed when the transfer complete interrupt *         is generated * @retval None */ void AdcDmaTransferComplete_Callback() { uint32_t tmp_index = 0; /* For the purpose of this example, dispatch multimode dual conversion data */ /* into arrays corresponding to ADC master and ADC slave conversion data.   */ /* Note: In a real application, this processing is useless and can be       */ /*       avoided by setting multimode DMA transfer to one DMA channel       */ /*       for each of ADC master and ADC slave.                              */ /*       Refer to function "LL_ADC_SetMultiDMATransfer()".                  */ /* Management of the 2nd half of the buffer */ for (tmp_index = (ADC_CONVERTED_DATA_BUFFER_SIZE / 3); tmp_index < ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index++) { aADCxMultimodeDualMasterConvertedData[tmp_index] = (uint16_t) __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(LL_ADC_MULTI_MASTER, aADCxADCyMultimodeDualConvertedData[tmp_index]); aADCyMultimodeDualSlaveConvertedData[tmp_index]  = (uint16_t) __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(LL_ADC_MULTI_SLAVE, aADCxADCyMultimodeDualConvertedData[tmp_index]); } /* Update status variable of DMA transfer */ ubDmaTransferStatus = 1; } #ifdef  USE_FULL_ASSERT /** * @brief  Reports the name of the source file and the source line number *         where the assert_param error has occurred. * @param  file: pointer to the source file name * @param  line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d", file, line) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ STM32 ADC三重采样的坑 Save to Pocket
添加于 2017年4月17日星期一 下午10:35:57 在位置 #1602 的文章剪切

我该拿什么去套利,雄安新区 Save to Pocket

添加于 2017年4月24日星期一 上午8:46:39 在位置 #7129 的文章剪切

小事 · 天生牵绊 工作后轮的第一个科是血管外科,顾名思义,就是跟全身大血管相关的科室。 那天来了一个 39 岁的女性患者,全身干瘦,精神不振,头发枯黄。诊断是右侧股动脉假性动脉瘤急性破裂。吸毒史 21 年,左侧股动脉已经在 3 年前同样因为假性动脉瘤行过手术。 假性动脉瘤指动脉管壁被撕裂或穿破, 血液自破口流出而被邻近的组织包裹而形成血肿,多由于创伤所致。 看到这里已经很明白了,她的病就是因为长期注射毒品但又找不对地方而导致双侧股动脉反复穿刺损伤所致。说来也奇怪,据血管外科的医生自己回忆,得了假性动脉瘤的病人十有八九都是瘾君子。 动脉瘤破裂很凶险,股动脉这种部位的出血分分钟要人命,必须急诊手术。 身为管床医生的我找到家属术前谈话。当时是她母亲在陪护,自然也就是谈话对象。 我常规的把可能出现的手术风险 blahblahblah 地说完,无非是大出血无法止住啊,输血可能过敏啊,呼吸心跳骤停啊之类的。 她母亲看起来打扮得体,虽然上了年纪但收拾得还挺整齐。她神情漠然地听完这些话以后,抿紧了嘴唇,非常用力地迅速地签完了自己的名字,然后恶狠狠地把笔一扔眼皮都没抬,说:“如果出事了就别抢救了!就让她去死好了!就当我没生过这个女儿!” 我当时就愣住了,不知道怎么接话,只好讪讪的收拾东西走人。 送病人下手术室的时候,她妈妈突然悄悄地把拉我到了一边,红着眼眶说:“医生啊,刚才我说的都是气话,你别当真。如果真要出了事还是要尽量抢救啊,再怎么说也是我女儿啊,我还是希望她能够变好……”说着说着眼泪就掉了下来。 你们可以想像一下,我当时面对这样一位老阿姨手足无措的样子。当时我还年轻,虽然能够理解阿姨的痛心,但无法感同身受。现在我自己当了父亲,再回忆起这一幕来,才更深刻地体会到她的心疼、气愤和无奈。 所以,当你自己任性妄为地抱着“这是我的事与你无关”的态度游戏人间时,好好想想最终你的烂摊子要谁来收拾?你的损失会不会连累他人?最后站在你病榻旁给你出手术费的是被你伤了无数次的父母家人还是那些一起吞云吐雾的社会渣滓? 不过我相信这个女病人不会明白,否则她不会经历这第二次手术。 Save to Pocket

添加于 2017年5月25日星期四 下午2:06:11 在位置 #1766 的文章剪切

为什么我们看不见已经发生的东西,却擅长去想没有发生的东西?因为我们的想法是原来的,而正发生的事情是新的。我们总想把这些事打包放到我们原有的框架里。这样的加工过程时时刻刻都在发生。我们以为「看见」的东西,其实已经是我们的「想象」了。 以前我以为,这

添加于 2017年7月3日星期一 下午11:15:05 您在位置 #4847-4849的标注

什么我们看不见已经发生的东西,却擅长去想没有发生的东西?因为我们的想法是原来的,而正发生的事情是新的。我们总想把这些事打包放到我们原有的框架里。这样的加工过程

添加于 2017年7月3日星期一 下午11:15:13 您在位置 #4847-4848的标注

为什么我们看不见已经发生的东西,却擅长去想没有发生的东西?因为我们的想法是原来的,而正发生的事情是新的。我们总想把这些事打包放到我们原有的框架里。这样的加工过程时时刻刻都在发生。我们以为「看见」的东西,其实已经是我们的「想象」了。

添加于 2017年7月3日星期一 下午11:15:19 您在位置 #4847-4849的标注

在用很远的方式思考生活。在这样的思考方式

添加于 2017年7月3日星期一 下午11:16:16 您在位置 #4856-4857的标注

他在用很远的方式思考生活。在这样的思考方式下,生活只剩下大纲,没有内容,自然也就变得无聊无趣。

添加于 2017年7月3日星期一 下午11:16:23 您在位置 #4856-4857的标注

小和尚问老和尚:师父,你得道前和得道后有什么不同?师父说,我得道前是吃饭睡觉,得道后也是吃饭睡觉。区别只在于,得道前我吃饭的时候想着睡觉,睡觉的时候想着吃饭。

添加于 2017年7月3日星期一 下午11:18:06 您在位置 #4869-4870的标注

小和尚问老和尚:师父,你得道前和得道后有什么不同?师父说,我得道前是吃饭睡觉,得道后也是吃饭睡觉。区别只在于,得道前我吃饭的时候想着睡觉,睡觉的时候想着吃饭。而得道后,我吃饭的时候只想吃饭,而睡觉的时候只想睡觉。 这个故事其实离我们也有点远。当我们说:「这不就是说要专注于自己正做的事情嘛」的时候,我们是想不到老和尚说的吃饭和睡觉,对他而言,是很生动的东西。也许一年的不同时节他会吃不同的蔬菜呢?也许有一天菜里的盐放多了或放少了呢?也许有一天他的胃口变好或者变坏了呢?就算每天吃一样的东西,谁又能想到他那一刻对饭菜美好的感觉呢? 我曾经说:生活的烦恼,源于我们总妄想控制我们控制不了的东西,却不愿对我们能够控制的东西,担负起责任。让我们烦

添加于 2017年7月3日星期一 下午11:18:14 您在位置 #4869-4876的标注

小和尚问老和尚:师父,你得道前和得道后有什么不同?师父说,我得道前是吃饭睡觉,得道后也是吃饭睡觉。区别只在于,得道前我吃饭的时候想着睡觉,睡觉的时候想着吃饭。而得道后,我吃饭的时候只想吃饭,而睡觉的时候只想睡觉

添加于 2017年7月3日星期一 下午11:18:28 您在位置 #4869-4871的标注

生活的烦恼,源于我们总妄想控制我们控制不了的东西,却不愿对我们能够控制的东西,担负起责任

添加于 2017年7月3日星期一 下午11:19:03 您在位置 #4875-4876的标注

「我能做什么?我愿意做吗?」在接下来的一星期,他不断用这句话来提醒自己,不要想太远的东西。

添加于 2017年7月3日星期一 下午11:21:33 您在位置 #4894-4895的标注

想以《杀鹌鹑的少女》中的一段话作为结语: 当你老了,回顾一生,就会发觉:什么时候出国读书,什么时候决定做第一份职业、何时选定了对象而恋爱、什么时候结婚,其实都是命运的巨变。 只是当时站在三岔路口,眼见风云千樯,你作出选择的那一日,在日记上,相当沉闷和平凡,当时还以为是生命中普通的一天。

添加于 2017年8月3日星期四 上午12:18:14 您在位置 #4151-4155的标注

想以《杀鹌鹑的少女》中的一段话作为结语: 当你老了,回顾一生,就会发觉:什么时候出国读书,什么时候决定做第一份职业、何时选定了对象而恋爱、什么时候结婚,其实都是命运的巨变。 只是当时站在三岔路口,眼见风云千樯,你作出选择的那一日,在日记上,相当沉闷和平凡,当时还以为是生命中普通的一天。

添加于 2017年8月3日星期四 上午12:18:20 您在位置 #4151-4155的标注

如果你每天还在看耶鲁公开课, 上3W咖啡听创业讲座, 知乎果壳关注无数, 36氪每日必读, 对马云的创业史了如指掌, 对张小龙的贪嗔痴如数家珍, 喜欢罗振宇胜过乔布斯, 逢人便谈互联网思维…… 那你应该还在每天挤地铁。”

添加于 2017年8月8日星期二 上午12:03:57 您在位置 #4144-4148的标注